Alex Bradbury 3d2650bdeb
[RISCV] Use addi rather than addiw for immediates materialised by lui+addi(w) pairs when possible (#141663)
The logic in RISCVMatInt would previously produce lui+addiw on RV64
whenever a 32-bit integer must be materialised and the Hi20 and Lo12
parts are non-zero. However, sometimes addi can be used equivalently
(whenever the sign extension behaviour of addiw would be a no-op). This
patch moves to using addiw only when necessary. Although there is
absolutely no advantage in terms of compressibility or performance, this
has the following advantages:
* It's more consistent with logic used elsewhere in the backend. For
instance, RISCVOptWInstrs will try to convert addiw to addi on the basis
it reduces test diffs vs RV32.
* This matches the lowering GCC does in its codegen path. Unlike LLVM,
GCC seems to have different expansion logic for the assembler vs
codegen. For codegen it will use lui+addi if possible, but expanding
`li` in the assembler will always produces lui+addiw as LLVM did prior
to this commit. As someone who has been looking at a lot of gcc vs clang
diffs lately, reducing unnecessary divergence is of at least some value.
* As the diff for fold-mem-offset.ll shows, we can fold memory offsets
in more cases when addi is used. Memory offset folding could be taught
to recognise when the addiw could be replaced with an addi, but that
seems unnecessary when we can simply change the logic in RISCVMatInt.

As pointed out by @topperc during review, making this change without
modifying RISCVOptWInstrs risks introducing some cases where we fail to
remove a sext.w that we removed before. I've incorporated a patch based
on a suggestion from Craig that avoids it, and also adds appropriate
RISCVOptWInstrs test cases.

The initial patch description noted that the main motivation was to
avoid unnecessary differences both for RV32/RV64 and when comparing GCC,
but noted that very occasionally we see a benefit from memory offset
folding kicking in when it didn't before. Looking at the dynamic
instruction count difference for SPEC benchmarks targeting rva22u64 and
it shows we actually get a meaningful
~4.3% reduction in dynamic icount for 519.lbm_r. Looking at the data
more closely, the codegen difference is in `LBM_performStreamCollideTRT`
which as a function accounts for ~98% for dynamically executed
instructions and the codegen diffs appear to be a knock-on effect of the
address merging reducing register pressure right from function entry
(for instance, we get a big reduction in dynamically executed loads in
that function).

Below is the icount data (rva22u64 -O3, no LTO):
```
Benchmark                Baseline            This PR   Diff (%)
============================================================
500.perlbench_r         174116601991    174115795810     -0.00%
502.gcc_r               218903280858    218903215788     -0.00%
505.mcf_r               131208029185    131207692803     -0.00%
508.namd_r              217497594322    217497594297     -0.00%
510.parest_r            289314486153    289313577652     -0.00%
511.povray_r             30640531048     30640765701      0.00%
519.lbm_r                95897914862     91712688050     -4.36%
520.omnetpp_r           134641549722    134867015683      0.17%
523.xalancbmk_r         281462762992    281432092673     -0.01%
525.x264_r              379776121941    379535558210     -0.06%
526.blender_r           659736022025    659738387343      0.00%
531.deepsjeng_r         349122867552    349122867481     -0.00%
538.imagick_r           238558760552    238558753269     -0.00%
541.leela_r             406578560612    406385135260     -0.05%
544.nab_r               400997131674    400996765827     -0.00%
557.xz_r                130079522194    129945515709     -0.10%

```

The instcounting setup I use doesn't have good support for drilling down
into functions from outside the linked executable (e.g. libc). The
difference in omnetpp all seems to come from there, and does not reflect
any degradation in codegen quality.

I can confirm with the current version of the PR there is no change in
the number of static sext.w across all the SPEC 2017 benchmarks
(rva22u64 O3)

Co-authored-by: Craig Topper <craig.topper@sifive.com>
2025-06-02 22:24:50 +01:00

29206 lines
1.1 MiB

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=RV32I %s
; RUN: llc -mtriple=riscv32 -mattr=+a -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS,RV32IA-WMO,RV32IA-WMO-NOZACAS %s
; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-NOZACAS,RV32IA-TSO,RV32IA-TSO-NOZACAS %s
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefix=RV64I %s
; RUN: llc -mtriple=riscv64 -mattr=+a -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS,RV64IA-WMO,RV64IA-WMO-NOZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-NOZACAS,RV64IA-TSO,RV64IA-TSO-NOZACAS %s
; RUN: llc -mtriple=riscv32 -mattr=+a,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-WMO,RV32IA-WMO-ZACAS %s
; RUN: llc -mtriple=riscv32 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV32IA,RV32IA-ZACAS,RV32IA-TSO,RV32IA-TSO-ZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-WMO,RV64IA-WMO-ZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-ZACAS,RV64IA-TSO,RV64IA-TSO-ZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-NOZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-NOZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+zabha,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-WMO,RV64IA-WMO-ZABHA,RV64IA-WMO-ZABHA-ZACAS %s
; RUN: llc -mtriple=riscv64 -mattr=+a,+ztso,+zabha,+zacas -verify-machineinstrs < %s \
; RUN: | FileCheck -check-prefixes=RV64IA,RV64IA-TSO,RV64IA-TSO-ZABHA,RV64IA-TSO-ZABHA-ZACAS %s
define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: mv a5, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB0_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: mv a5, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB0_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: mv a5, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB0_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB1_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB1_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB1_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB1_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB1_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB1_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB2_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB2_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB2_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB2_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB2_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB2_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB3_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB3_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB3_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB3_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB3_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB3_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB3_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: mv a5, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB4_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: mv a5, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB4_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB4_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: mv a5, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB4_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 %b seq_cst
ret i8 %1
}
; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an
; amoand or amoor with appropriate mask.
define i8 @atomicrmw_xchg_0_i8_monotonic(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a1, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a2, 255
; RV32IA-NEXT: sll a2, a2, a0
; RV32IA-NEXT: not a2, a2
; RV32IA-NEXT: amoand.w a1, a2, (a1)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a2, 255
; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-NOZACAS-NEXT: not a2, a2
; RV64IA-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a2, 255
; RV64IA-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-ZACAS-NEXT: not a2, a2
; RV64IA-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 0 monotonic
ret i8 %1
}
define i8 @atomicrmw_xchg_0_i8_acquire(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aq a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 0 acquire
ret i8 %1
}
define i8 @atomicrmw_xchg_0_i8_release(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.rl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 0 release
ret i8 %1
}
define i8 @atomicrmw_xchg_0_i8_acq_rel(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 0 acq_rel
ret i8 %1
}
define i8 @atomicrmw_xchg_0_i8_seq_cst(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 0 seq_cst
ret i8 %1
}
define i8 @atomicrmw_xchg_minus_1_i8_monotonic(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 255
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a1, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a2, 255
; RV32IA-NEXT: sll a2, a2, a0
; RV32IA-NEXT: amoor.w a1, a2, (a1)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 255
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a2, 255
; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a2, 255
; RV64IA-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 -1 monotonic
ret i8 %1
}
define i8 @atomicrmw_xchg_minus_1_i8_acquire(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 255
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aq a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 255
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 -1 acquire
ret i8 %1
}
define i8 @atomicrmw_xchg_minus_1_i8_release(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 255
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.rl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 255
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 -1 release
ret i8 %1
}
define i8 @atomicrmw_xchg_minus_1_i8_acq_rel(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 255
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 255
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 -1 acq_rel
ret i8 %1
}
define i8 @atomicrmw_xchg_minus_1_i8_seq_cst(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 255
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_exchange_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a2, 255
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a2, 255
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 255
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a2, 255
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a2, 255
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a2, 255
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a2, 255
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i8 -1 seq_cst
ret i8 %1
}
define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_add_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: add a5, a4, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB15_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_add_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB15_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB15_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: add a5, a4, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB15_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_add_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: add a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB16_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: add a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB16_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_add_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB16_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB16_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB16_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB16_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB16_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_add_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: add a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB17_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: add a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB17_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_add_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB17_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB17_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB17_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB17_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB17_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_add_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: add a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB18_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: add a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB18_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_add_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB18_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB18_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB18_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB18_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB18_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_add_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: add a5, a4, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB19_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_add_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_add_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: add a5, a4, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB19_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_add_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB19_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: add a5, a4, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB19_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_sub_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: sub a5, a4, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB20_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_sub_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB20_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB20_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB20_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_sub_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: sub a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB21_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: sub a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB21_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_sub_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB21_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB21_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB21_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB21_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB21_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_sub_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: sub a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB22_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: sub a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB22_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_sub_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB22_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB22_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB22_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB22_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB22_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_sub_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: sub a5, a4, a1
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB23_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: sub a5, a4, a1
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB23_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_sub_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB23_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB23_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB23_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB23_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB23_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_sub_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: sub a5, a4, a1
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB24_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_sub_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: sub a5, a4, a1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB24_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_sub_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB24_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: sub a5, a4, a1
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB24_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_and_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: not a3, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: or a1, a1, a3
; RV32IA-NEXT: amoand.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_and_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_and_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: not a3, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_and_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: not a3, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: or a1, a1, a3
; RV64IA-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_and_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: not a3, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: not a3, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_and_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_and_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_and_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: not a3, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: not a3, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_and_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_and_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_and_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: not a3, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: not a3, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_and_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_and_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_and_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i8_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: not a3, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i8_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: not a3, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_and_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_nand_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: and a5, a4, a1
; RV32IA-NEXT: not a5, a5
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB30_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_nand_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-NOZACAS-NEXT: not a5, a5
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB30_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: and a5, a4, a1
; RV64IA-ZACAS-NEXT: not a5, a5
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB30_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB30_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB30_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB30_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB30_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB30_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_monotonic:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB30_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB30_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_nand_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_nand_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a5, a4, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB31_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a5, a4, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB31_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_nand_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB31_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB31_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB31_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aq a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB31_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acquire:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB31_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB31_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_nand_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_nand_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: and a5, a4, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB32_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a5, a4, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB32_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_nand_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB32_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB32_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB32_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.rl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB32_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_release:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB32_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB32_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_nand_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_nand_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a5, a4, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB33_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a5, a4, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB33_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_nand_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB33_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB33_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB33_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aqrl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB33_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_acq_rel:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB33_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB33_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_nand_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: and a5, a4, a1
; RV32IA-NEXT: not a5, a5
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB34_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_nand_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-NOZACAS-NEXT: not a5, a5
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB34_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: and a5, a4, a1
; RV64IA-ZACAS-NEXT: not a5, a5
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB34_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB34_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB34_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a4, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB34_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB34_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.b.aqrl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB34_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i8_seq_cst:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lbu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB34_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.b a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 56
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB34_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_or_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: amoor.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_or_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_or_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_or_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_or_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_or_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_or_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_or_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_or_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_or_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_or_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_or_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_or_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_or_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i8_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i8_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_or_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_xor_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_xor_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xor_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_xor_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_xor_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_xor_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_xor_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_xor_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_xor_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_xor_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_xor_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_xor_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_xor_1
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i8_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i8_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_xor_1
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB45_2
; RV32I-NEXT: .LBB45_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB45_4
; RV32I-NEXT: .LBB45_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB45_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB45_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB45_1
; RV32I-NEXT: .LBB45_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: slli a1, a1, 24
; RV32IA-NEXT: andi a4, a0, 24
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: srai a1, a1, 24
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: xori a4, a4, 24
; RV32IA-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a7, a1, .LBB45_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1
; RV32IA-NEXT: sc.w a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB45_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB45_2
; RV64I-NEXT: .LBB45_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB45_4
; RV64I-NEXT: .LBB45_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB45_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB45_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB45_1
; RV64I-NEXT: .LBB45_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-NOZACAS-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB45_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB45_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-ZACAS-NEXT: .LBB45_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB45_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB45_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB45_3: # in Loop: Header=BB45_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB45_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_max_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB46_2
; RV32I-NEXT: .LBB46_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB46_4
; RV32I-NEXT: .LBB46_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB46_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB46_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB46_1
; RV32I-NEXT: .LBB46_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB46_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB46_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB46_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB46_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB46_2
; RV64I-NEXT: .LBB46_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB46_4
; RV64I-NEXT: .LBB46_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB46_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB46_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB46_1
; RV64I-NEXT: .LBB46_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB46_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB46_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB46_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB46_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB46_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB46_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB46_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB46_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB46_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB46_3: # in Loop: Header=BB46_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB46_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_max_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB47_2
; RV32I-NEXT: .LBB47_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB47_4
; RV32I-NEXT: .LBB47_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB47_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB47_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB47_1
; RV32I-NEXT: .LBB47_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB47_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB47_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB47_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB47_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB47_2
; RV64I-NEXT: .LBB47_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB47_4
; RV64I-NEXT: .LBB47_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB47_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB47_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB47_1
; RV64I-NEXT: .LBB47_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB47_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB47_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB47_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB47_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB47_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB47_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB47_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB47_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB47_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB47_3: # in Loop: Header=BB47_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB47_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_max_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB48_2
; RV32I-NEXT: .LBB48_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB48_4
; RV32I-NEXT: .LBB48_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB48_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB48_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB48_1
; RV32I-NEXT: .LBB48_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB48_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB48_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB48_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB48_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB48_2
; RV64I-NEXT: .LBB48_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB48_4
; RV64I-NEXT: .LBB48_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB48_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB48_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB48_1
; RV64I-NEXT: .LBB48_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB48_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB48_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB48_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB48_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB48_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB48_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB48_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB48_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB48_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB48_3: # in Loop: Header=BB48_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB48_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_max_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB49_2
; RV32I-NEXT: .LBB49_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB49_4
; RV32I-NEXT: .LBB49_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB49_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB49_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB49_1
; RV32I-NEXT: .LBB49_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: slli a1, a1, 24
; RV32IA-NEXT: andi a4, a0, 24
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: srai a1, a1, 24
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: xori a4, a4, 24
; RV32IA-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a7, a1, .LBB49_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1
; RV32IA-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB49_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB49_2
; RV64I-NEXT: .LBB49_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB49_4
; RV64I-NEXT: .LBB49_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB49_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB49_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB49_1
; RV64I-NEXT: .LBB49_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_max_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-NOZACAS-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB49_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB49_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_max_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-ZACAS-NEXT: .LBB49_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB49_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB49_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB49_3: # in Loop: Header=BB49_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB49_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB50_2
; RV32I-NEXT: .LBB50_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB50_4
; RV32I-NEXT: .LBB50_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB50_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB50_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB50_1
; RV32I-NEXT: .LBB50_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: slli a1, a1, 24
; RV32IA-NEXT: andi a4, a0, 24
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: srai a1, a1, 24
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: xori a4, a4, 24
; RV32IA-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a1, a7, .LBB50_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1
; RV32IA-NEXT: sc.w a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB50_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB50_2
; RV64I-NEXT: .LBB50_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB50_4
; RV64I-NEXT: .LBB50_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB50_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB50_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB50_1
; RV64I-NEXT: .LBB50_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-NOZACAS-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB50_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB50_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-ZACAS-NEXT: .LBB50_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB50_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB50_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB50_3: # in Loop: Header=BB50_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB50_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_min_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB51_2
; RV32I-NEXT: .LBB51_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB51_4
; RV32I-NEXT: .LBB51_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB51_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB51_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB51_1
; RV32I-NEXT: .LBB51_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB51_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB51_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB51_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB51_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB51_2
; RV64I-NEXT: .LBB51_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB51_4
; RV64I-NEXT: .LBB51_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB51_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB51_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB51_1
; RV64I-NEXT: .LBB51_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB51_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB51_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB51_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB51_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB51_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB51_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB51_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB51_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB51_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB51_3: # in Loop: Header=BB51_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB51_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_min_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB52_2
; RV32I-NEXT: .LBB52_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB52_4
; RV32I-NEXT: .LBB52_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB52_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB52_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB52_1
; RV32I-NEXT: .LBB52_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB52_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB52_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB52_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB52_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB52_2
; RV64I-NEXT: .LBB52_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB52_4
; RV64I-NEXT: .LBB52_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB52_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB52_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB52_1
; RV64I-NEXT: .LBB52_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB52_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB52_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB52_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB52_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB52_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB52_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB52_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB52_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB52_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB52_3: # in Loop: Header=BB52_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB52_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_min_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB53_2
; RV32I-NEXT: .LBB53_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB53_4
; RV32I-NEXT: .LBB53_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB53_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB53_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB53_1
; RV32I-NEXT: .LBB53_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: slli a1, a1, 24
; RV32IA-WMO-NEXT: andi a4, a0, 24
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: srai a1, a1, 24
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: xori a4, a4, 24
; RV32IA-WMO-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB53_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB53_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: slli a1, a1, 24
; RV32IA-TSO-NEXT: andi a4, a0, 24
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: srai a1, a1, 24
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: xori a4, a4, 24
; RV32IA-TSO-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB53_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB53_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB53_2
; RV64I-NEXT: .LBB53_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB53_4
; RV64I-NEXT: .LBB53_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB53_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB53_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB53_1
; RV64I-NEXT: .LBB53_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-NOZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB53_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB53_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-NOZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB53_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB53_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-WMO-ZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB53_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB53_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-TSO-ZACAS-NEXT: .LBB53_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB53_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB53_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB53_3: # in Loop: Header=BB53_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB53_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_min_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 24
; RV32I-NEXT: srai s2, a0, 24
; RV32I-NEXT: j .LBB54_2
; RV32I-NEXT: .LBB54_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB54_4
; RV32I-NEXT: .LBB54_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 24
; RV32I-NEXT: srai a0, a0, 24
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB54_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB54_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB54_1
; RV32I-NEXT: .LBB54_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: slli a1, a1, 24
; RV32IA-NEXT: andi a4, a0, 24
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: srai a1, a1, 24
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: xori a4, a4, 24
; RV32IA-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a1, a7, .LBB54_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1
; RV32IA-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB54_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 56
; RV64I-NEXT: srai s2, a0, 56
; RV64I-NEXT: j .LBB54_2
; RV64I-NEXT: .LBB54_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB54_4
; RV64I-NEXT: .LBB54_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 56
; RV64I-NEXT: srai a0, a0, 56
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB54_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB54_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB54_1
; RV64I-NEXT: .LBB54_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_min_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: slli a1, a1, 56
; RV64IA-NOZACAS-NEXT: andi a4, a0, 24
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: srai a1, a1, 56
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: xori a4, a4, 56
; RV64IA-NOZACAS-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB54_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB54_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_min_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: slli a1, a1, 56
; RV64IA-ZACAS-NEXT: andi a4, a0, 24
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: srai a1, a1, 56
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: xori a4, a4, 56
; RV64IA-ZACAS-NEXT: .LBB54_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB54_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB54_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB54_3: # in Loop: Header=BB54_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB54_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB55_2
; RV32I-NEXT: .LBB55_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB55_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB55_4
; RV32I-NEXT: .LBB55_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s2, a0, .LBB55_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB55_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB55_1
; RV32I-NEXT: .LBB55_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: and a6, a4, a3
; RV32IA-NEXT: mv a5, a4
; RV32IA-NEXT: bgeu a6, a1, .LBB55_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1
; RV32IA-NEXT: xor a5, a4, a1
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB55_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB55_2
; RV64I-NEXT: .LBB55_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB55_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB55_4
; RV64I-NEXT: .LBB55_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a0, .LBB55_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB55_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB55_1
; RV64I-NEXT: .LBB55_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-NOZACAS-NEXT: mv a5, a4
; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB55_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB55_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB55_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: and a6, a4, a3
; RV64IA-ZACAS-NEXT: mv a5, a4
; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB55_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB55_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: .LBB55_3: # in Loop: Header=BB55_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB55_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_umax_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB56_2
; RV32I-NEXT: .LBB56_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB56_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB56_4
; RV32I-NEXT: .LBB56_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s2, a0, .LBB56_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB56_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB56_1
; RV32I-NEXT: .LBB56_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB56_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB56_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB56_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB56_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB56_2
; RV64I-NEXT: .LBB56_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB56_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB56_4
; RV64I-NEXT: .LBB56_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a0, .LBB56_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB56_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB56_1
; RV64I-NEXT: .LBB56_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB56_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB56_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB56_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB56_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB56_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB56_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB56_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB56_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB56_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB56_3: # in Loop: Header=BB56_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB56_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_umax_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB57_2
; RV32I-NEXT: .LBB57_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB57_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB57_4
; RV32I-NEXT: .LBB57_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s2, a0, .LBB57_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB57_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB57_1
; RV32I-NEXT: .LBB57_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB57_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB57_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB57_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB57_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB57_2
; RV64I-NEXT: .LBB57_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB57_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB57_4
; RV64I-NEXT: .LBB57_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a0, .LBB57_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB57_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB57_1
; RV64I-NEXT: .LBB57_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB57_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB57_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB57_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB57_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB57_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB57_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB57_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB57_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB57_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB57_3: # in Loop: Header=BB57_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB57_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_umax_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB58_2
; RV32I-NEXT: .LBB58_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB58_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB58_4
; RV32I-NEXT: .LBB58_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s2, a0, .LBB58_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB58_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB58_1
; RV32I-NEXT: .LBB58_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB58_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB58_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB58_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB58_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB58_2
; RV64I-NEXT: .LBB58_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB58_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB58_4
; RV64I-NEXT: .LBB58_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a0, .LBB58_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB58_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB58_1
; RV64I-NEXT: .LBB58_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB58_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB58_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB58_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB58_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB58_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB58_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB58_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB58_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB58_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB58_3: # in Loop: Header=BB58_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB58_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_umax_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB59_2
; RV32I-NEXT: .LBB59_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB59_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB59_4
; RV32I-NEXT: .LBB59_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s2, a0, .LBB59_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB59_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB59_1
; RV32I-NEXT: .LBB59_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: and a6, a4, a3
; RV32IA-NEXT: mv a5, a4
; RV32IA-NEXT: bgeu a6, a1, .LBB59_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1
; RV32IA-NEXT: xor a5, a4, a1
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB59_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB59_2
; RV64I-NEXT: .LBB59_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB59_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB59_4
; RV64I-NEXT: .LBB59_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a0, .LBB59_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB59_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB59_1
; RV64I-NEXT: .LBB59_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-NOZACAS-NEXT: mv a5, a4
; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB59_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB59_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB59_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: and a6, a4, a3
; RV64IA-ZACAS-NEXT: mv a5, a4
; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB59_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB59_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: .LBB59_3: # in Loop: Header=BB59_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB59_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i8 %b seq_cst
ret i8 %1
}
define i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i8_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB60_2
; RV32I-NEXT: .LBB60_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB60_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB60_4
; RV32I-NEXT: .LBB60_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s2, a0, .LBB60_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB60_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB60_1
; RV32I-NEXT: .LBB60_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i8_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a4, (a2)
; RV32IA-NEXT: and a6, a4, a3
; RV32IA-NEXT: mv a5, a4
; RV32IA-NEXT: bgeu a1, a6, .LBB60_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1
; RV32IA-NEXT: xor a5, a4, a1
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB60_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i8_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB60_2
; RV64I-NEXT: .LBB60_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB60_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB60_4
; RV64I-NEXT: .LBB60_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a0, .LBB60_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB60_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB60_1
; RV64I-NEXT: .LBB60_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-NOZACAS-NEXT: mv a5, a4
; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB60_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB60_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB60_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-ZACAS-NEXT: and a6, a4, a3
; RV64IA-ZACAS-NEXT: mv a5, a4
; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB60_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB60_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: .LBB60_3: # in Loop: Header=BB60_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB60_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i8 %b monotonic
ret i8 %1
}
define i8 @atomicrmw_umin_i8_acquire(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i8_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB61_2
; RV32I-NEXT: .LBB61_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB61_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB61_4
; RV32I-NEXT: .LBB61_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s2, a0, .LBB61_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB61_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB61_1
; RV32I-NEXT: .LBB61_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB61_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB61_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB61_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB61_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i8_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB61_2
; RV64I-NEXT: .LBB61_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB61_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB61_4
; RV64I-NEXT: .LBB61_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a0, .LBB61_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB61_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB61_1
; RV64I-NEXT: .LBB61_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB61_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB61_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB61_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB61_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB61_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB61_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB61_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB61_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB61_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB61_3: # in Loop: Header=BB61_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB61_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.b.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i8 %b acquire
ret i8 %1
}
define i8 @atomicrmw_umin_i8_release(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i8_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB62_2
; RV32I-NEXT: .LBB62_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB62_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB62_4
; RV32I-NEXT: .LBB62_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s2, a0, .LBB62_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB62_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB62_1
; RV32I-NEXT: .LBB62_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i8_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB62_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB62_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i8_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB62_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB62_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i8_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB62_2
; RV64I-NEXT: .LBB62_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB62_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB62_4
; RV64I-NEXT: .LBB62_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a0, .LBB62_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB62_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB62_1
; RV64I-NEXT: .LBB62_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB62_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB62_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB62_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB62_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB62_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB62_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB62_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB62_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB62_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB62_3: # in Loop: Header=BB62_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB62_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.b.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i8 %b release
ret i8 %1
}
define i8 @atomicrmw_umin_i8_acq_rel(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i8_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB63_2
; RV32I-NEXT: .LBB63_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB63_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB63_4
; RV32I-NEXT: .LBB63_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s2, a0, .LBB63_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB63_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB63_1
; RV32I-NEXT: .LBB63_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i8_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: li a3, 255
; RV32IA-WMO-NEXT: zext.b a1, a1
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a4, (a2)
; RV32IA-WMO-NEXT: and a6, a4, a3
; RV32IA-WMO-NEXT: mv a5, a4
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB63_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a4, a1
; RV32IA-WMO-NEXT: and a5, a5, a3
; RV32IA-WMO-NEXT: xor a5, a4, a5
; RV32IA-WMO-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB63_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a4, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i8_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: li a3, 255
; RV32IA-TSO-NEXT: zext.b a1, a1
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a4, (a2)
; RV32IA-TSO-NEXT: and a6, a4, a3
; RV32IA-TSO-NEXT: mv a5, a4
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB63_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a4, a1
; RV32IA-TSO-NEXT: and a5, a5, a3
; RV32IA-TSO-NEXT: xor a5, a4, a5
; RV32IA-TSO-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB63_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a4, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB63_2
; RV64I-NEXT: .LBB63_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB63_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB63_4
; RV64I-NEXT: .LBB63_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a0, .LBB63_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB63_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB63_1
; RV64I-NEXT: .LBB63_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: li a3, 255
; RV64IA-WMO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a4
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB63_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB63_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: li a3, 255
; RV64IA-TSO-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a4
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB63_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB63_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: li a3, 255
; RV64IA-WMO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-WMO-ZACAS-NEXT: mv a5, a4
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB63_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-WMO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB63_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: li a3, 255
; RV64IA-TSO-ZACAS-NEXT: zext.b a1, a1
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB63_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a4, a3
; RV64IA-TSO-ZACAS-NEXT: mv a5, a4
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB63_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB63_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a3
; RV64IA-TSO-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB63_3: # in Loop: Header=BB63_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB63_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i8 %b acq_rel
ret i8 %1
}
define i8 @atomicrmw_umin_i8_seq_cst(ptr %a, i8 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i8_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lbu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: zext.b s2, a1
; RV32I-NEXT: j .LBB64_2
; RV32I-NEXT: .LBB64_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB64_2 Depth=1
; RV32I-NEXT: sb a3, 15(sp)
; RV32I-NEXT: addi a1, sp, 15
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_1
; RV32I-NEXT: lbu a3, 15(sp)
; RV32I-NEXT: bnez a0, .LBB64_4
; RV32I-NEXT: .LBB64_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: zext.b a0, a3
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s2, a0, .LBB64_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB64_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB64_1
; RV32I-NEXT: .LBB64_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i8_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: li a3, 255
; RV32IA-NEXT: zext.b a1, a1
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a4, (a2)
; RV32IA-NEXT: and a6, a4, a3
; RV32IA-NEXT: mv a5, a4
; RV32IA-NEXT: bgeu a1, a6, .LBB64_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1
; RV32IA-NEXT: xor a5, a4, a1
; RV32IA-NEXT: and a5, a5, a3
; RV32IA-NEXT: xor a5, a4, a5
; RV32IA-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB64_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a4, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lbu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: zext.b s2, a1
; RV64I-NEXT: j .LBB64_2
; RV64I-NEXT: .LBB64_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB64_2 Depth=1
; RV64I-NEXT: sb a3, 15(sp)
; RV64I-NEXT: addi a1, sp, 15
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_1
; RV64I-NEXT: lbu a3, 15(sp)
; RV64I-NEXT: bnez a0, .LBB64_4
; RV64I-NEXT: .LBB64_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: zext.b a0, a3
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a0, .LBB64_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB64_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB64_1
; RV64I-NEXT: .LBB64_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: li a3, 255
; RV64IA-NOZACAS-NEXT: zext.b a1, a1
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a4, a3
; RV64IA-NOZACAS-NEXT: mv a5, a4
; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB64_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a4, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a3
; RV64IA-NOZACAS-NEXT: xor a5, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB64_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a4, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: li a3, 255
; RV64IA-ZACAS-NEXT: zext.b a1, a1
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB64_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a4, (a2)
; RV64IA-ZACAS-NEXT: and a6, a4, a3
; RV64IA-ZACAS-NEXT: mv a5, a4
; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB64_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB64_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a4, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a3
; RV64IA-ZACAS-NEXT: xor a5, a4, a5
; RV64IA-ZACAS-NEXT: .LBB64_3: # in Loop: Header=BB64_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB64_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a4, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.b.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i8_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.b a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i8 %b seq_cst
ret i8 %1
}
define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: mv a5, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB65_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: mv a5, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB65_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB65_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: mv a5, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB65_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB66_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB66_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB66_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB66_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB66_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB66_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB66_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB67_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB67_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB67_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB67_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB67_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB67_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB67_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: mv a5, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB68_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: mv a5, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB68_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB68_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB68_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: mv a5, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB68_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB68_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: mv a5, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB68_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: mv a5, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB69_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: mv a5, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB69_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB69_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: mv a5, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB69_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 %b seq_cst
ret i16 %1
}
; Ensure the following 'atomicrmw xchg a, {0,-1}` cases are lowered to an
; amoand or amoor with appropriate mask.
define i16 @atomicrmw_xchg_0_i16_monotonic(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a1, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a2, 16
; RV32IA-NEXT: addi a2, a2, -1
; RV32IA-NEXT: sll a2, a2, a0
; RV32IA-NEXT: not a2, a2
; RV32IA-NEXT: amoand.w a1, a2, (a1)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a2, 16
; RV64IA-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-NOZACAS-NEXT: not a2, a2
; RV64IA-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a2, 16
; RV64IA-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-ZACAS-NEXT: not a2, a2
; RV64IA-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 0 monotonic
ret i16 %1
}
define i16 @atomicrmw_xchg_0_i16_acquire(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aq a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 0 acquire
ret i16 %1
}
define i16 @atomicrmw_xchg_0_i16_release(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.rl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 0 release
ret i16 %1
}
define i16 @atomicrmw_xchg_0_i16_acq_rel(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 0 acq_rel
ret i16 %1
}
define i16 @atomicrmw_xchg_0_i16_seq_cst(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: li a1, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: not a2, a2
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: not a2, a2
; RV32IA-TSO-NEXT: amoand.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: li a1, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: not a2, a2
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: not a2, a2
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: not a2, a2
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: not a2, a2
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, zero, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_0_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, zero, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 0 seq_cst
ret i16 %1
}
define i16 @atomicrmw_xchg_minus_1_i16_monotonic(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a1, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a2, 16
; RV32IA-NEXT: addi a2, a2, -1
; RV32IA-NEXT: sll a2, a2, a0
; RV32IA-NEXT: amoor.w a1, a2, (a1)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addi a1, a1, -1
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a2, 16
; RV64IA-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a2, 16
; RV64IA-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 -1 monotonic
ret i16 %1
}
define i16 @atomicrmw_xchg_minus_1_i16_acquire(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aq a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addi a1, a1, -1
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 -1 acquire
ret i16 %1
}
define i16 @atomicrmw_xchg_minus_1_i16_release(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.rl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addi a1, a1, -1
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 -1 release
ret i16 %1
}
define i16 @atomicrmw_xchg_minus_1_i16_acq_rel(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addi a1, a1, -1
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 -1 acq_rel
ret i16 %1
}
define i16 @atomicrmw_xchg_minus_1_i16_seq_cst(ptr %a) nounwind {
; RV32I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: lui a1, 16
; RV32I-NEXT: addi a1, a1, -1
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_exchange_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a1, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a2, 16
; RV32IA-WMO-NEXT: addi a2, a2, -1
; RV32IA-WMO-NEXT: sll a2, a2, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a1, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a2, 16
; RV32IA-TSO-NEXT: addi a2, a2, -1
; RV32IA-TSO-NEXT: sll a2, a2, a0
; RV32IA-TSO-NEXT: amoor.w a1, a2, (a1)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: lui a1, 16
; RV64I-NEXT: addi a1, a1, -1
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a2, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a2, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a2, 16
; RV64IA-WMO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a2, (a1)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a1, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a2, 16
; RV64IA-TSO-ZACAS-NEXT: addi a2, a2, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a2, a2, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a2, (a1)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: li a1, -1
; RV64IA-WMO-ZABHA-NEXT: amoswap.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xchg_minus_1_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: li a1, -1
; RV64IA-TSO-ZABHA-NEXT: amoswap.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i16 -1 seq_cst
ret i16 %1
}
define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_add_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: add a5, a3, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB80_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_add_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB80_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB80_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: add a5, a3, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB80_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_add_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: add a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB81_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: add a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB81_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_add_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB81_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB81_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB81_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB81_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB81_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_add_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: add a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB82_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: add a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB82_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_add_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB82_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB82_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB82_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB82_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB82_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_add_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: add a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB83_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: add a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB83_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_add_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB83_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB83_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB83_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB83_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: add a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB83_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_add_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: add a5, a3, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB84_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_add_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_add_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: add a5, a3, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB84_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_add_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB84_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: add a5, a3, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB84_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_add_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw add ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_sub_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: sub a5, a3, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB85_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_sub_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB85_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB85_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB85_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_sub_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: sub a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB86_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: sub a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB86_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_sub_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB86_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB86_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB86_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB86_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB86_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_sub_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: sub a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB87_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: sub a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB87_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_sub_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB87_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB87_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB87_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB87_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB87_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_sub_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: sub a5, a3, a1
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB88_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: sub a5, a3, a1
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB88_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_sub_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB88_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB88_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB88_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB88_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB88_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_sub_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: sub a5, a3, a1
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB89_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_sub_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_sub_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: sub a5, a3, a1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB89_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_sub_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB89_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: sub a5, a3, a1
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB89_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: neg a1, a1
; RV64IA-WMO-ZABHA-NEXT: amoadd.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_sub_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: neg a1, a1
; RV64IA-TSO-ZABHA-NEXT: amoadd.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw sub ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_and_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: not a3, a4
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: or a1, a1, a3
; RV32IA-NEXT: amoand.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_and_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_and_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: not a3, a4
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_and_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: not a3, a4
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: or a1, a1, a3
; RV64IA-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_and_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: not a3, a4
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: not a3, a4
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_and_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: not a3, a4
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: not a3, a4
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: not a3, a4
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: not a3, a4
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_and_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_and_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: not a3, a4
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: not a3, a4
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_and_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: not a3, a4
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: not a3, a4
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: not a3, a4
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: not a3, a4
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_and_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_and_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: not a3, a4
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: not a3, a4
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_and_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: not a3, a4
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: not a3, a4
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: not a3, a4
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: not a3, a4
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_and_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_and_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i16_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: not a3, a4
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: or a1, a1, a3
; RV32IA-WMO-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i16_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: not a3, a4
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: or a1, a1, a3
; RV32IA-TSO-NEXT: amoand.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_and_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: not a3, a4
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: not a3, a4
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: not a3, a4
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: amoand.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: not a3, a4
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: or a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: amoand.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoand.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_and_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoand.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw and ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_nand_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: and a5, a3, a1
; RV32IA-NEXT: not a5, a5
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB95_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_nand_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-NOZACAS-NEXT: not a5, a5
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB95_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: and a5, a3, a1
; RV64IA-ZACAS-NEXT: not a5, a5
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB95_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB95_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB95_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB95_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB95_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB95_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_monotonic:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB95_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB95_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_nand_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_nand_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a5, a3, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB96_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a5, a3, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB96_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_nand_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB96_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB96_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB96_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aq a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB96_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acquire:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB96_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB96_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_nand_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_nand_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: and a5, a3, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB97_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a5, a3, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB97_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_nand_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB97_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB97_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB97_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.rl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB97_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_release:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB97_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB97_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_nand_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_nand_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_nand_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a5, a3, a1
; RV32IA-WMO-NEXT: not a5, a5
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB98_1
; RV32IA-WMO-NEXT: # %bb.2:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_nand_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a5, a3, a1
; RV32IA-TSO-NEXT: not a5, a5
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB98_1
; RV32IA-TSO-NEXT: # %bb.2:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_nand_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB98_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB98_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB98_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aqrl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB98_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_acq_rel:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB98_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB98_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_nand_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: and a5, a3, a1
; RV32IA-NEXT: not a5, a5
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB99_1
; RV32IA-NEXT: # %bb.2:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_nand_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-NOZACAS-NEXT: not a5, a5
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB99_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: and a5, a3, a1
; RV64IA-ZACAS-NEXT: not a5, a5
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB99_1
; RV64IA-ZACAS-NEXT: # %bb.2:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB99_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB99_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a3, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a5, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a5, .LBB99_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB99_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.h.aqrl a0, a3, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB99_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i16_seq_cst:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lhu a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB99_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a3, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-ZACAS-NEXT: slli a4, a0, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.h a0, a3, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: srai a4, a4, 48
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a4, .LBB99_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_or_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: srli a1, a1, 16
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: amoor.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_or_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_or_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_or_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_or_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_or_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_or_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_or_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_or_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_or_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_or_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_or_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_or_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_or_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i16_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i16_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_or_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoor.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_or_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw or ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_xor_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: srli a1, a1, 16
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-NEXT: srl a0, a1, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_xor_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_xor_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_xor_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_xor_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aq a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_xor_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aq a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aq a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_xor_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_xor_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.rl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_xor_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.rl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.rl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_xor_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_xor_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_xor_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_xor_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_xor_2
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i16_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: srli a1, a1, 16
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV32IA-WMO-NEXT: srl a0, a1, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i16_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: srli a1, a1, 16
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: amoxor.w a1, a1, (a2)
; RV32IA-TSO-NEXT: srl a0, a1, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_xor_2
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: amoxor.w.aqrl a1, a1, (a2)
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: srli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: amoxor.w a1, a1, (a2)
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a1, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amoxor.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_xor_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amoxor.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw xor ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB110_2
; RV32I-NEXT: .LBB110_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB110_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB110_4
; RV32I-NEXT: .LBB110_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB110_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB110_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB110_1
; RV32I-NEXT: .LBB110_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: li a4, 16
; RV32IA-NEXT: andi a5, a0, 24
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: srai a1, a1, 16
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: sub a4, a4, a5
; RV32IA-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a7, a1, .LBB110_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1
; RV32IA-NEXT: sc.w a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB110_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB110_2
; RV64I-NEXT: .LBB110_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB110_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB110_4
; RV64I-NEXT: .LBB110_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB110_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB110_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB110_1
; RV64I-NEXT: .LBB110_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: li a4, 48
; RV64IA-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB110_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB110_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: li a4, 48
; RV64IA-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-ZACAS-NEXT: .LBB110_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB110_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB110_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB110_3: # in Loop: Header=BB110_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB110_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_max_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB111_2
; RV32I-NEXT: .LBB111_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB111_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB111_4
; RV32I-NEXT: .LBB111_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB111_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB111_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB111_1
; RV32I-NEXT: .LBB111_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB111_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB111_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB111_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB111_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB111_2
; RV64I-NEXT: .LBB111_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB111_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB111_4
; RV64I-NEXT: .LBB111_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB111_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB111_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB111_1
; RV64I-NEXT: .LBB111_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB111_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB111_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB111_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB111_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB111_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB111_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB111_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB111_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB111_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB111_3: # in Loop: Header=BB111_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB111_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_max_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB112_2
; RV32I-NEXT: .LBB112_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB112_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB112_4
; RV32I-NEXT: .LBB112_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB112_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB112_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB112_1
; RV32I-NEXT: .LBB112_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB112_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB112_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB112_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB112_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB112_2
; RV64I-NEXT: .LBB112_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB112_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB112_4
; RV64I-NEXT: .LBB112_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB112_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB112_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB112_1
; RV64I-NEXT: .LBB112_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB112_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB112_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB112_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB112_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB112_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB112_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB112_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB112_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB112_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB112_3: # in Loop: Header=BB112_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB112_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_max_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB113_2
; RV32I-NEXT: .LBB113_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB113_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB113_4
; RV32I-NEXT: .LBB113_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB113_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB113_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB113_1
; RV32I-NEXT: .LBB113_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a7, a1, .LBB113_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB113_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a7, a1, .LBB113_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB113_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB113_2
; RV64I-NEXT: .LBB113_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB113_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB113_4
; RV64I-NEXT: .LBB113_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB113_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB113_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB113_1
; RV64I-NEXT: .LBB113_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a7, a1, .LBB113_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB113_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a7, a1, .LBB113_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB113_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a7, a1, .LBB113_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB113_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB113_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a7, a1, .LBB113_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB113_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB113_3: # in Loop: Header=BB113_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB113_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_max_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB114_2
; RV32I-NEXT: .LBB114_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB114_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB114_4
; RV32I-NEXT: .LBB114_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s2, a0, .LBB114_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB114_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB114_1
; RV32I-NEXT: .LBB114_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: li a4, 16
; RV32IA-NEXT: andi a5, a0, 24
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: srai a1, a1, 16
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: sub a4, a4, a5
; RV32IA-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a7, a1, .LBB114_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1
; RV32IA-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB114_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB114_2
; RV64I-NEXT: .LBB114_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB114_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB114_4
; RV64I-NEXT: .LBB114_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a0, .LBB114_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB114_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB114_1
; RV64I-NEXT: .LBB114_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_max_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: li a4, 48
; RV64IA-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a7, a1, .LBB114_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB114_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_max_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: li a4, 48
; RV64IA-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-ZACAS-NEXT: .LBB114_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a7, a1, .LBB114_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB114_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB114_3: # in Loop: Header=BB114_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB114_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomax.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_max_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomax.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw max ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB115_2
; RV32I-NEXT: .LBB115_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB115_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB115_4
; RV32I-NEXT: .LBB115_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB115_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB115_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB115_1
; RV32I-NEXT: .LBB115_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: li a4, 16
; RV32IA-NEXT: andi a5, a0, 24
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: srai a1, a1, 16
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: sub a4, a4, a5
; RV32IA-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a1, a7, .LBB115_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1
; RV32IA-NEXT: sc.w a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB115_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB115_2
; RV64I-NEXT: .LBB115_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB115_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB115_4
; RV64I-NEXT: .LBB115_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB115_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB115_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB115_1
; RV64I-NEXT: .LBB115_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: li a4, 48
; RV64IA-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB115_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB115_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: li a4, 48
; RV64IA-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-ZACAS-NEXT: .LBB115_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB115_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB115_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB115_3: # in Loop: Header=BB115_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB115_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_min_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB116_2
; RV32I-NEXT: .LBB116_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB116_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB116_4
; RV32I-NEXT: .LBB116_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB116_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB116_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB116_1
; RV32I-NEXT: .LBB116_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB116_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB116_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB116_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB116_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB116_2
; RV64I-NEXT: .LBB116_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB116_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB116_4
; RV64I-NEXT: .LBB116_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB116_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB116_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB116_1
; RV64I-NEXT: .LBB116_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB116_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB116_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB116_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB116_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB116_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB116_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB116_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB116_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB116_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB116_3: # in Loop: Header=BB116_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB116_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_min_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB117_2
; RV32I-NEXT: .LBB117_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB117_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB117_4
; RV32I-NEXT: .LBB117_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB117_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB117_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB117_1
; RV32I-NEXT: .LBB117_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB117_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB117_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB117_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB117_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB117_2
; RV64I-NEXT: .LBB117_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB117_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB117_4
; RV64I-NEXT: .LBB117_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB117_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB117_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB117_1
; RV64I-NEXT: .LBB117_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB117_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB117_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB117_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB117_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB117_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB117_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB117_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB117_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB117_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB117_3: # in Loop: Header=BB117_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB117_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_min_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB118_2
; RV32I-NEXT: .LBB118_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB118_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB118_4
; RV32I-NEXT: .LBB118_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB118_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB118_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB118_1
; RV32I-NEXT: .LBB118_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: slli a1, a1, 16
; RV32IA-WMO-NEXT: li a4, 16
; RV32IA-WMO-NEXT: andi a5, a0, 24
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: srai a1, a1, 16
; RV32IA-WMO-NEXT: sll a3, a3, a0
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: sub a4, a4, a5
; RV32IA-WMO-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a5, (a2)
; RV32IA-WMO-NEXT: and a7, a5, a3
; RV32IA-WMO-NEXT: mv a6, a5
; RV32IA-WMO-NEXT: sll a7, a7, a4
; RV32IA-WMO-NEXT: sra a7, a7, a4
; RV32IA-WMO-NEXT: bge a1, a7, .LBB118_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV32IA-WMO-NEXT: xor a6, a5, a1
; RV32IA-WMO-NEXT: and a6, a6, a3
; RV32IA-WMO-NEXT: xor a6, a5, a6
; RV32IA-WMO-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-WMO-NEXT: bnez a6, .LBB118_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a5, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: slli a1, a1, 16
; RV32IA-TSO-NEXT: li a4, 16
; RV32IA-TSO-NEXT: andi a5, a0, 24
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: srai a1, a1, 16
; RV32IA-TSO-NEXT: sll a3, a3, a0
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: sub a4, a4, a5
; RV32IA-TSO-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a5, (a2)
; RV32IA-TSO-NEXT: and a7, a5, a3
; RV32IA-TSO-NEXT: mv a6, a5
; RV32IA-TSO-NEXT: sll a7, a7, a4
; RV32IA-TSO-NEXT: sra a7, a7, a4
; RV32IA-TSO-NEXT: bge a1, a7, .LBB118_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV32IA-TSO-NEXT: xor a6, a5, a1
; RV32IA-TSO-NEXT: and a6, a6, a3
; RV32IA-TSO-NEXT: xor a6, a5, a6
; RV32IA-TSO-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a6, a6, (a2)
; RV32IA-TSO-NEXT: bnez a6, .LBB118_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a5, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB118_2
; RV64I-NEXT: .LBB118_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB118_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB118_4
; RV64I-NEXT: .LBB118_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB118_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB118_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB118_1
; RV64I-NEXT: .LBB118_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: li a4, 48
; RV64IA-WMO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-NOZACAS-NEXT: mv a6, a5
; RV64IA-WMO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-NOZACAS-NEXT: bge a1, a7, .LBB118_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-NOZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a6, .LBB118_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: li a4, 48
; RV64IA-TSO-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-NOZACAS-NEXT: mv a6, a5
; RV64IA-TSO-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-NOZACAS-NEXT: bge a1, a7, .LBB118_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-NOZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a6, .LBB118_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: li a4, 48
; RV64IA-WMO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-WMO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-WMO-ZACAS-NEXT: mv a6, a5
; RV64IA-WMO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-WMO-ZACAS-NEXT: bge a1, a7, .LBB118_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-WMO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-WMO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-WMO-ZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a6, .LBB118_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: li a4, 48
; RV64IA-TSO-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-TSO-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB118_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a7, a5, a3
; RV64IA-TSO-ZACAS-NEXT: mv a6, a5
; RV64IA-TSO-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-TSO-ZACAS-NEXT: bge a1, a7, .LBB118_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB118_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-TSO-ZACAS-NEXT: and a6, a6, a3
; RV64IA-TSO-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-TSO-ZACAS-NEXT: .LBB118_3: # in Loop: Header=BB118_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a6, a6, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a6, .LBB118_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_min_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lhu a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: slli a0, a1, 16
; RV32I-NEXT: srai s2, a0, 16
; RV32I-NEXT: j .LBB119_2
; RV32I-NEXT: .LBB119_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB119_2 Depth=1
; RV32I-NEXT: sh a3, 14(sp)
; RV32I-NEXT: addi a1, sp, 14
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a3, 14(sp)
; RV32I-NEXT: bnez a0, .LBB119_4
; RV32I-NEXT: .LBB119_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: slli a0, a3, 16
; RV32I-NEXT: srai a0, a0, 16
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s2, a0, .LBB119_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB119_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB119_1
; RV32I-NEXT: .LBB119_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: slli a1, a1, 16
; RV32IA-NEXT: li a4, 16
; RV32IA-NEXT: andi a5, a0, 24
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: srai a1, a1, 16
; RV32IA-NEXT: sll a3, a3, a0
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: sub a4, a4, a5
; RV32IA-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a5, (a2)
; RV32IA-NEXT: and a7, a5, a3
; RV32IA-NEXT: mv a6, a5
; RV32IA-NEXT: sll a7, a7, a4
; RV32IA-NEXT: sra a7, a7, a4
; RV32IA-NEXT: bge a1, a7, .LBB119_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1
; RV32IA-NEXT: xor a6, a5, a1
; RV32IA-NEXT: and a6, a6, a3
; RV32IA-NEXT: xor a6, a5, a6
; RV32IA-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1
; RV32IA-NEXT: sc.w.rl a6, a6, (a2)
; RV32IA-NEXT: bnez a6, .LBB119_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a5, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lhu a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: slli a0, a1, 48
; RV64I-NEXT: srai s2, a0, 48
; RV64I-NEXT: j .LBB119_2
; RV64I-NEXT: .LBB119_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB119_2 Depth=1
; RV64I-NEXT: sh a3, 14(sp)
; RV64I-NEXT: addi a1, sp, 14
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a3, 14(sp)
; RV64I-NEXT: bnez a0, .LBB119_4
; RV64I-NEXT: .LBB119_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: slli a0, a3, 48
; RV64I-NEXT: srai a0, a0, 48
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a0, .LBB119_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB119_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB119_1
; RV64I-NEXT: .LBB119_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_min_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: slli a1, a1, 48
; RV64IA-NOZACAS-NEXT: li a4, 48
; RV64IA-NOZACAS-NEXT: andi a5, a0, 24
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: srai a1, a1, 48
; RV64IA-NOZACAS-NEXT: sllw a3, a3, a0
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: sub a4, a4, a5
; RV64IA-NOZACAS-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-NOZACAS-NEXT: and a7, a5, a3
; RV64IA-NOZACAS-NEXT: mv a6, a5
; RV64IA-NOZACAS-NEXT: sll a7, a7, a4
; RV64IA-NOZACAS-NEXT: sra a7, a7, a4
; RV64IA-NOZACAS-NEXT: bge a1, a7, .LBB119_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a6, a5, a1
; RV64IA-NOZACAS-NEXT: and a6, a6, a3
; RV64IA-NOZACAS-NEXT: xor a6, a5, a6
; RV64IA-NOZACAS-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-NOZACAS-NEXT: bnez a6, .LBB119_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a5, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_min_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: slli a1, a1, 48
; RV64IA-ZACAS-NEXT: li a4, 48
; RV64IA-ZACAS-NEXT: andi a5, a0, 24
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: srai a1, a1, 48
; RV64IA-ZACAS-NEXT: sllw a3, a3, a0
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: sub a4, a4, a5
; RV64IA-ZACAS-NEXT: .LBB119_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a5, (a2)
; RV64IA-ZACAS-NEXT: and a7, a5, a3
; RV64IA-ZACAS-NEXT: mv a6, a5
; RV64IA-ZACAS-NEXT: sll a7, a7, a4
; RV64IA-ZACAS-NEXT: sra a7, a7, a4
; RV64IA-ZACAS-NEXT: bge a1, a7, .LBB119_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB119_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a6, a5, a1
; RV64IA-ZACAS-NEXT: and a6, a6, a3
; RV64IA-ZACAS-NEXT: xor a6, a5, a6
; RV64IA-ZACAS-NEXT: .LBB119_3: # in Loop: Header=BB119_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a6, a6, (a2)
; RV64IA-ZACAS-NEXT: bnez a6, .LBB119_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a5, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomin.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_min_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomin.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw min ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB120_2
; RV32I-NEXT: .LBB120_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB120_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB120_4
; RV32I-NEXT: .LBB120_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bltu s3, a0, .LBB120_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB120_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB120_1
; RV32I-NEXT: .LBB120_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: and a6, a3, a4
; RV32IA-NEXT: mv a5, a3
; RV32IA-NEXT: bgeu a6, a1, .LBB120_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1
; RV32IA-NEXT: xor a5, a3, a1
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB120_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB120_2
; RV64I-NEXT: .LBB120_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB120_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB120_4
; RV64I-NEXT: .LBB120_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bltu s3, a0, .LBB120_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB120_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB120_1
; RV64I-NEXT: .LBB120_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-NOZACAS-NEXT: mv a5, a3
; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB120_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB120_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB120_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: and a6, a3, a4
; RV64IA-ZACAS-NEXT: mv a5, a3
; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB120_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB120_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: .LBB120_3: # in Loop: Header=BB120_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB120_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_umax_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB121_2
; RV32I-NEXT: .LBB121_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB121_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB121_4
; RV32I-NEXT: .LBB121_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bltu s3, a0, .LBB121_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB121_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB121_1
; RV32I-NEXT: .LBB121_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB121_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB121_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB121_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB121_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB121_2
; RV64I-NEXT: .LBB121_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB121_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB121_4
; RV64I-NEXT: .LBB121_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bltu s3, a0, .LBB121_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB121_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB121_1
; RV64I-NEXT: .LBB121_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB121_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB121_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB121_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB121_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB121_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB121_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB121_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB121_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB121_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB121_3: # in Loop: Header=BB121_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB121_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_umax_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB122_2
; RV32I-NEXT: .LBB122_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB122_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB122_4
; RV32I-NEXT: .LBB122_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bltu s3, a0, .LBB122_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB122_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB122_1
; RV32I-NEXT: .LBB122_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB122_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB122_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB122_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB122_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB122_2
; RV64I-NEXT: .LBB122_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB122_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB122_4
; RV64I-NEXT: .LBB122_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bltu s3, a0, .LBB122_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB122_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB122_1
; RV64I-NEXT: .LBB122_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB122_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB122_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB122_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB122_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB122_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB122_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB122_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB122_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB122_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB122_3: # in Loop: Header=BB122_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB122_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_umax_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB123_2
; RV32I-NEXT: .LBB123_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB123_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB123_4
; RV32I-NEXT: .LBB123_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bltu s3, a0, .LBB123_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB123_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB123_1
; RV32I-NEXT: .LBB123_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a6, a1, .LBB123_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB123_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a6, a1, .LBB123_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB123_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB123_2
; RV64I-NEXT: .LBB123_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB123_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB123_4
; RV64I-NEXT: .LBB123_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bltu s3, a0, .LBB123_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB123_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB123_1
; RV64I-NEXT: .LBB123_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a6, a1, .LBB123_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB123_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a6, a1, .LBB123_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB123_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a6, a1, .LBB123_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB123_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB123_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a6, a1, .LBB123_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB123_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB123_3: # in Loop: Header=BB123_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB123_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_umax_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB124_2
; RV32I-NEXT: .LBB124_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB124_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB124_4
; RV32I-NEXT: .LBB124_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bltu s3, a0, .LBB124_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB124_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB124_1
; RV32I-NEXT: .LBB124_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: and a6, a3, a4
; RV32IA-NEXT: mv a5, a3
; RV32IA-NEXT: bgeu a6, a1, .LBB124_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1
; RV32IA-NEXT: xor a5, a3, a1
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB124_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB124_2
; RV64I-NEXT: .LBB124_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB124_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB124_4
; RV64I-NEXT: .LBB124_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bltu s3, a0, .LBB124_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB124_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB124_1
; RV64I-NEXT: .LBB124_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umax_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-NOZACAS-NEXT: mv a5, a3
; RV64IA-NOZACAS-NEXT: bgeu a6, a1, .LBB124_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB124_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umax_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB124_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: and a6, a3, a4
; RV64IA-ZACAS-NEXT: mv a5, a3
; RV64IA-ZACAS-NEXT: bgeu a6, a1, .LBB124_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB124_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: .LBB124_3: # in Loop: Header=BB124_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB124_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amomaxu.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umax_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amomaxu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umax ptr %a, i16 %b seq_cst
ret i16 %1
}
define i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB125_2
; RV32I-NEXT: .LBB125_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB125_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB125_4
; RV32I-NEXT: .LBB125_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bgeu s3, a0, .LBB125_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB125_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB125_1
; RV32I-NEXT: .LBB125_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i16_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w a3, (a2)
; RV32IA-NEXT: and a6, a3, a4
; RV32IA-NEXT: mv a5, a3
; RV32IA-NEXT: bgeu a1, a6, .LBB125_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1
; RV32IA-NEXT: xor a5, a3, a1
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1
; RV32IA-NEXT: sc.w a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB125_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i16_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB125_2
; RV64I-NEXT: .LBB125_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB125_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB125_4
; RV64I-NEXT: .LBB125_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bgeu s3, a0, .LBB125_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB125_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB125_1
; RV64I-NEXT: .LBB125_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-NOZACAS-NEXT: mv a5, a3
; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB125_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB125_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB125_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-ZACAS-NEXT: and a6, a3, a4
; RV64IA-ZACAS-NEXT: mv a5, a3
; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB125_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB125_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: .LBB125_3: # in Loop: Header=BB125_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB125_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_monotonic:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i16 %b monotonic
ret i16 %1
}
define i16 @atomicrmw_umin_i16_acquire(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB126_2
; RV32I-NEXT: .LBB126_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB126_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB126_4
; RV32I-NEXT: .LBB126_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bgeu s3, a0, .LBB126_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB126_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB126_1
; RV32I-NEXT: .LBB126_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB126_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV32IA-WMO-NEXT: sc.w a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB126_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB126_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB126_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i16_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB126_2
; RV64I-NEXT: .LBB126_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB126_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB126_4
; RV64I-NEXT: .LBB126_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bgeu s3, a0, .LBB126_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB126_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB126_1
; RV64I-NEXT: .LBB126_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB126_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB126_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB126_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB126_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB126_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB126_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB126_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB126_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB126_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB126_3: # in Loop: Header=BB126_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB126_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.h.aq a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acquire:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i16 %b acquire
ret i16 %1
}
define i16 @atomicrmw_umin_i16_release(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB127_2
; RV32I-NEXT: .LBB127_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB127_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB127_4
; RV32I-NEXT: .LBB127_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bgeu s3, a0, .LBB127_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB127_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB127_1
; RV32I-NEXT: .LBB127_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i16_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB127_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB127_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i16_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB127_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB127_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i16_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB127_2
; RV64I-NEXT: .LBB127_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB127_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB127_4
; RV64I-NEXT: .LBB127_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bgeu s3, a0, .LBB127_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB127_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB127_1
; RV64I-NEXT: .LBB127_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB127_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB127_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB127_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB127_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB127_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB127_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB127_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB127_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB127_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB127_3: # in Loop: Header=BB127_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB127_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_release:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.h.rl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_release:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i16 %b release
ret i16 %1
}
define i16 @atomicrmw_umin_i16_acq_rel(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB128_2
; RV32I-NEXT: .LBB128_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB128_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB128_4
; RV32I-NEXT: .LBB128_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bgeu s3, a0, .LBB128_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB128_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB128_1
; RV32I-NEXT: .LBB128_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i16_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: andi a2, a0, -4
; RV32IA-WMO-NEXT: slli a0, a0, 3
; RV32IA-WMO-NEXT: lui a3, 16
; RV32IA-WMO-NEXT: addi a3, a3, -1
; RV32IA-WMO-NEXT: sll a4, a3, a0
; RV32IA-WMO-NEXT: and a1, a1, a3
; RV32IA-WMO-NEXT: sll a1, a1, a0
; RV32IA-WMO-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NEXT: lr.w.aq a3, (a2)
; RV32IA-WMO-NEXT: and a6, a3, a4
; RV32IA-WMO-NEXT: mv a5, a3
; RV32IA-WMO-NEXT: bgeu a1, a6, .LBB128_3
; RV32IA-WMO-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV32IA-WMO-NEXT: xor a5, a3, a1
; RV32IA-WMO-NEXT: and a5, a5, a4
; RV32IA-WMO-NEXT: xor a5, a3, a5
; RV32IA-WMO-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV32IA-WMO-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-WMO-NEXT: bnez a5, .LBB128_1
; RV32IA-WMO-NEXT: # %bb.4:
; RV32IA-WMO-NEXT: srl a0, a3, a0
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i16_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: andi a2, a0, -4
; RV32IA-TSO-NEXT: slli a0, a0, 3
; RV32IA-TSO-NEXT: lui a3, 16
; RV32IA-TSO-NEXT: addi a3, a3, -1
; RV32IA-TSO-NEXT: sll a4, a3, a0
; RV32IA-TSO-NEXT: and a1, a1, a3
; RV32IA-TSO-NEXT: sll a1, a1, a0
; RV32IA-TSO-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NEXT: lr.w a3, (a2)
; RV32IA-TSO-NEXT: and a6, a3, a4
; RV32IA-TSO-NEXT: mv a5, a3
; RV32IA-TSO-NEXT: bgeu a1, a6, .LBB128_3
; RV32IA-TSO-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV32IA-TSO-NEXT: xor a5, a3, a1
; RV32IA-TSO-NEXT: and a5, a5, a4
; RV32IA-TSO-NEXT: xor a5, a3, a5
; RV32IA-TSO-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV32IA-TSO-NEXT: sc.w a5, a5, (a2)
; RV32IA-TSO-NEXT: bnez a5, .LBB128_1
; RV32IA-TSO-NEXT: # %bb.4:
; RV32IA-TSO-NEXT: srl a0, a3, a0
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB128_2
; RV64I-NEXT: .LBB128_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB128_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB128_4
; RV64I-NEXT: .LBB128_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bgeu s3, a0, .LBB128_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB128_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB128_1
; RV64I-NEXT: .LBB128_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-NOZACAS-NEXT: lui a3, 16
; RV64IA-WMO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-NOZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-NOZACAS-NEXT: mv a5, a3
; RV64IA-WMO-NOZACAS-NEXT: bgeu a1, a6, .LBB128_3
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-NOZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-NOZACAS-NEXT: bnez a5, .LBB128_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.4:
; RV64IA-WMO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-NOZACAS-NEXT: lui a3, 16
; RV64IA-TSO-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-NOZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-NOZACAS-NEXT: mv a5, a3
; RV64IA-TSO-NOZACAS-NEXT: bgeu a1, a6, .LBB128_3
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-NOZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV64IA-TSO-NOZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-NOZACAS-NEXT: bnez a5, .LBB128_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.4:
; RV64IA-TSO-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-WMO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-WMO-ZACAS-NEXT: lui a3, 16
; RV64IA-WMO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-WMO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-WMO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-WMO-ZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: lr.w.aq a3, (a2)
; RV64IA-WMO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-WMO-ZACAS-NEXT: mv a5, a3
; RV64IA-WMO-ZACAS-NEXT: bgeu a1, a6, .LBB128_3
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-WMO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-WMO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-WMO-ZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV64IA-WMO-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-WMO-ZACAS-NEXT: bnez a5, .LBB128_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.4:
; RV64IA-WMO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-TSO-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-TSO-ZACAS-NEXT: lui a3, 16
; RV64IA-TSO-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-TSO-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a1, a1, a3
; RV64IA-TSO-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-TSO-ZACAS-NEXT: .LBB128_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: lr.w a3, (a2)
; RV64IA-TSO-ZACAS-NEXT: and a6, a3, a4
; RV64IA-TSO-ZACAS-NEXT: mv a5, a3
; RV64IA-TSO-ZACAS-NEXT: bgeu a1, a6, .LBB128_3
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB128_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-TSO-ZACAS-NEXT: and a5, a5, a4
; RV64IA-TSO-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-TSO-ZACAS-NEXT: .LBB128_3: # in Loop: Header=BB128_1 Depth=1
; RV64IA-TSO-ZACAS-NEXT: sc.w a5, a5, (a2)
; RV64IA-TSO-ZACAS-NEXT: bnez a5, .LBB128_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.4:
; RV64IA-TSO-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_acq_rel:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i16 %b acq_rel
ret i16 %1
}
define i16 @atomicrmw_umin_i16_seq_cst(ptr %a, i16 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i16_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s3, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a1
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lhu a1, 0(a0)
; RV32I-NEXT: lui s2, 16
; RV32I-NEXT: addi s2, s2, -1
; RV32I-NEXT: and s3, s0, s2
; RV32I-NEXT: j .LBB129_2
; RV32I-NEXT: .LBB129_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB129_2 Depth=1
; RV32I-NEXT: sh a1, 10(sp)
; RV32I-NEXT: addi a1, sp, 10
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_2
; RV32I-NEXT: lh a1, 10(sp)
; RV32I-NEXT: bnez a0, .LBB129_4
; RV32I-NEXT: .LBB129_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: and a0, a1, s2
; RV32I-NEXT: mv a2, a1
; RV32I-NEXT: bgeu s3, a0, .LBB129_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB129_2 Depth=1
; RV32I-NEXT: mv a2, s0
; RV32I-NEXT: j .LBB129_1
; RV32I-NEXT: .LBB129_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a1
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s3, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i16_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: andi a2, a0, -4
; RV32IA-NEXT: slli a0, a0, 3
; RV32IA-NEXT: lui a3, 16
; RV32IA-NEXT: addi a3, a3, -1
; RV32IA-NEXT: sll a4, a3, a0
; RV32IA-NEXT: and a1, a1, a3
; RV32IA-NEXT: sll a1, a1, a0
; RV32IA-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: lr.w.aqrl a3, (a2)
; RV32IA-NEXT: and a6, a3, a4
; RV32IA-NEXT: mv a5, a3
; RV32IA-NEXT: bgeu a1, a6, .LBB129_3
; RV32IA-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1
; RV32IA-NEXT: xor a5, a3, a1
; RV32IA-NEXT: and a5, a5, a4
; RV32IA-NEXT: xor a5, a3, a5
; RV32IA-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1
; RV32IA-NEXT: sc.w.rl a5, a5, (a2)
; RV32IA-NEXT: bnez a5, .LBB129_1
; RV32IA-NEXT: # %bb.4:
; RV32IA-NEXT: srl a0, a3, a0
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i16_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s3, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a1
; RV64I-NEXT: mv s1, a0
; RV64I-NEXT: lhu a1, 0(a0)
; RV64I-NEXT: lui s2, 16
; RV64I-NEXT: addi s2, s2, -1
; RV64I-NEXT: and s3, s0, s2
; RV64I-NEXT: j .LBB129_2
; RV64I-NEXT: .LBB129_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB129_2 Depth=1
; RV64I-NEXT: sh a1, 6(sp)
; RV64I-NEXT: addi a1, sp, 6
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s1
; RV64I-NEXT: call __atomic_compare_exchange_2
; RV64I-NEXT: lh a1, 6(sp)
; RV64I-NEXT: bnez a0, .LBB129_4
; RV64I-NEXT: .LBB129_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: and a0, a1, s2
; RV64I-NEXT: mv a2, a1
; RV64I-NEXT: bgeu s3, a0, .LBB129_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB129_2 Depth=1
; RV64I-NEXT: mv a2, s0
; RV64I-NEXT: j .LBB129_1
; RV64I-NEXT: .LBB129_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a1
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s3, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_umin_i16_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: andi a2, a0, -4
; RV64IA-NOZACAS-NEXT: slli a0, a0, 3
; RV64IA-NOZACAS-NEXT: lui a3, 16
; RV64IA-NOZACAS-NEXT: addi a3, a3, -1
; RV64IA-NOZACAS-NEXT: sllw a4, a3, a0
; RV64IA-NOZACAS-NEXT: and a1, a1, a3
; RV64IA-NOZACAS-NEXT: sllw a1, a1, a0
; RV64IA-NOZACAS-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-NOZACAS-NEXT: and a6, a3, a4
; RV64IA-NOZACAS-NEXT: mv a5, a3
; RV64IA-NOZACAS-NEXT: bgeu a1, a6, .LBB129_3
; RV64IA-NOZACAS-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1
; RV64IA-NOZACAS-NEXT: xor a5, a3, a1
; RV64IA-NOZACAS-NEXT: and a5, a5, a4
; RV64IA-NOZACAS-NEXT: xor a5, a3, a5
; RV64IA-NOZACAS-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1
; RV64IA-NOZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-NOZACAS-NEXT: bnez a5, .LBB129_1
; RV64IA-NOZACAS-NEXT: # %bb.4:
; RV64IA-NOZACAS-NEXT: srlw a0, a3, a0
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_umin_i16_seq_cst:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: andi a2, a0, -4
; RV64IA-ZACAS-NEXT: slli a0, a0, 3
; RV64IA-ZACAS-NEXT: lui a3, 16
; RV64IA-ZACAS-NEXT: addi a3, a3, -1
; RV64IA-ZACAS-NEXT: sllw a4, a3, a0
; RV64IA-ZACAS-NEXT: and a1, a1, a3
; RV64IA-ZACAS-NEXT: sllw a1, a1, a0
; RV64IA-ZACAS-NEXT: .LBB129_1: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: lr.w.aqrl a3, (a2)
; RV64IA-ZACAS-NEXT: and a6, a3, a4
; RV64IA-ZACAS-NEXT: mv a5, a3
; RV64IA-ZACAS-NEXT: bgeu a1, a6, .LBB129_3
; RV64IA-ZACAS-NEXT: # %bb.2: # in Loop: Header=BB129_1 Depth=1
; RV64IA-ZACAS-NEXT: xor a5, a3, a1
; RV64IA-ZACAS-NEXT: and a5, a5, a4
; RV64IA-ZACAS-NEXT: xor a5, a3, a5
; RV64IA-ZACAS-NEXT: .LBB129_3: # in Loop: Header=BB129_1 Depth=1
; RV64IA-ZACAS-NEXT: sc.w.rl a5, a5, (a2)
; RV64IA-ZACAS-NEXT: bnez a5, .LBB129_1
; RV64IA-ZACAS-NEXT: # %bb.4:
; RV64IA-ZACAS-NEXT: srlw a0, a3, a0
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst:
; RV64IA-WMO-ZABHA: # %bb.0:
; RV64IA-WMO-ZABHA-NEXT: amominu.h.aqrl a0, a1, (a0)
; RV64IA-WMO-ZABHA-NEXT: ret
;
; RV64IA-TSO-ZABHA-LABEL: atomicrmw_umin_i16_seq_cst:
; RV64IA-TSO-ZABHA: # %bb.0:
; RV64IA-TSO-ZABHA-NEXT: amominu.h a0, a1, (a0)
; RV64IA-TSO-ZABHA-NEXT: ret
%1 = atomicrmw umin ptr %a, i16 %b seq_cst
ret i16 %1
}
define i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_exchange_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amoswap.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_xchg_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoswap.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_xchg_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_exchange_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoswap.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_xchg_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_exchange_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoswap.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_xchg_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_exchange_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_xchg_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_exchange_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_add_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_add_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_add_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw add ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_add_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_add_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_add_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_add_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_add_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_add_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_add_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_add_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_add_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_add_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_add_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_add_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_add_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_add_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_sub_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: neg a1, a1
; RV32IA-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_sub_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_sub_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: neg a1, a1
; RV64IA-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw sub ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_sub_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_sub_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: neg a1, a1
; RV32IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: neg a1, a1
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_sub_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_sub_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_sub_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: neg a1, a1
; RV32IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: neg a1, a1
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_sub_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_sub_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_sub_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: neg a1, a1
; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: neg a1, a1
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_sub_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_sub_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_sub_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: neg a1, a1
; RV32IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: neg a1, a1
; RV32IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_sub_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_and_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amoand.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_and_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_and_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoand.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw and ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_and_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_and_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoand.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_and_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_and_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_and_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoand.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_and_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_and_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_and_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_and_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_and_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_and_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_and_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_and_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_and_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_nand_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV32IA-NOZACAS: # %bb.0:
; RV32IA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NOZACAS-NEXT: lr.w a2, (a0)
; RV32IA-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-NOZACAS-NEXT: not a3, a3
; RV32IA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV32IA-NOZACAS-NEXT: bnez a3, .LBB150_1
; RV32IA-NOZACAS-NEXT: # %bb.2:
; RV32IA-NOZACAS-NEXT: mv a0, a2
; RV32IA-NOZACAS-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_nand_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-NOZACAS-NEXT: not a3, a3
; RV64IA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-NOZACAS-NEXT: bnez a3, .LBB150_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: mv a0, a2
; RV64IA-NOZACAS-NEXT: ret
;
; RV32IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV32IA-ZACAS: # %bb.0:
; RV32IA-ZACAS-NEXT: mv a2, a0
; RV32IA-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start
; RV32IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-ZACAS-NEXT: mv a3, a0
; RV32IA-ZACAS-NEXT: and a4, a0, a1
; RV32IA-ZACAS-NEXT: not a4, a4
; RV32IA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV32IA-ZACAS-NEXT: bne a0, a3, .LBB150_1
; RV32IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-ZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: mv a2, a0
; RV64IA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start
; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: mv a3, a0
; RV64IA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-ZACAS-NEXT: not a4, a4
; RV64IA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB150_1
; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB150_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB150_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB150_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB150_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_monotonic:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB150_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB150_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_nand_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_nand_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV32IA-WMO-NOZACAS: # %bb.0:
; RV32IA-WMO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-WMO-NOZACAS-NEXT: not a3, a3
; RV32IA-WMO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV32IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV32IA-WMO-NOZACAS-NEXT: ret
;
; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV32IA-TSO-NOZACAS: # %bb.0:
; RV32IA-TSO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-TSO-NOZACAS-NEXT: not a3, a3
; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV32IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV32IA-TSO-NOZACAS-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_nand_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV32IA-WMO-ZACAS: # %bb.0:
; RV32IA-WMO-ZACAS-NEXT: mv a2, a0
; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-WMO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-ZACAS-NEXT: mv a3, a0
; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-WMO-ZACAS-NEXT: not a4, a4
; RV32IA-WMO-ZACAS-NEXT: amocas.w.aq a0, a4, (a2)
; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-WMO-ZACAS-NEXT: ret
;
; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV32IA-TSO-ZACAS: # %bb.0:
; RV32IA-TSO-ZACAS-NEXT: mv a2, a0
; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-TSO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-ZACAS-NEXT: mv a3, a0
; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-TSO-ZACAS-NEXT: not a4, a4
; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.w.aq a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB151_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB151_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aq a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acquire:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB151_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB151_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_nand_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_nand_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV32IA-WMO-NOZACAS: # %bb.0:
; RV32IA-WMO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NOZACAS-NEXT: lr.w a2, (a0)
; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-WMO-NOZACAS-NEXT: not a3, a3
; RV32IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV32IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV32IA-WMO-NOZACAS-NEXT: ret
;
; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV32IA-TSO-NOZACAS: # %bb.0:
; RV32IA-TSO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-TSO-NOZACAS-NEXT: not a3, a3
; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV32IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV32IA-TSO-NOZACAS-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_nand_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV32IA-WMO-ZACAS: # %bb.0:
; RV32IA-WMO-ZACAS-NEXT: mv a2, a0
; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-WMO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-ZACAS-NEXT: mv a3, a0
; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-WMO-ZACAS-NEXT: not a4, a4
; RV32IA-WMO-ZACAS-NEXT: amocas.w.rl a0, a4, (a2)
; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-WMO-ZACAS-NEXT: ret
;
; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV32IA-TSO-ZACAS: # %bb.0:
; RV32IA-TSO-ZACAS-NEXT: mv a2, a0
; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-TSO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-ZACAS-NEXT: mv a3, a0
; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-TSO-ZACAS-NEXT: not a4, a4
; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.w.rl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB152_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB152_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.rl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_release:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB152_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB152_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_nand_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_nand_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV32IA-WMO-NOZACAS: # %bb.0:
; RV32IA-WMO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV32IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-WMO-NOZACAS-NEXT: not a3, a3
; RV32IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV32IA-WMO-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV32IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV32IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV32IA-WMO-NOZACAS-NEXT: ret
;
; RV32IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV32IA-TSO-NOZACAS: # %bb.0:
; RV32IA-TSO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV32IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-TSO-NOZACAS-NEXT: not a3, a3
; RV32IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV32IA-TSO-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV32IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV32IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV32IA-TSO-NOZACAS-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_nand_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV32IA-WMO-ZACAS: # %bb.0:
; RV32IA-WMO-ZACAS-NEXT: mv a2, a0
; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-WMO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-ZACAS-NEXT: mv a3, a0
; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-WMO-ZACAS-NEXT: not a4, a4
; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-WMO-ZACAS-NEXT: ret
;
; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV32IA-TSO-ZACAS: # %bb.0:
; RV32IA-TSO-ZACAS-NEXT: mv a2, a0
; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-TSO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-ZACAS-NEXT: mv a3, a0
; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-TSO-ZACAS-NEXT: not a4, a4
; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aq a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB153_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB153_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_acq_rel:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB153_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB153_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_nand_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV32IA-NOZACAS: # %bb.0:
; RV32IA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1
; RV32IA-NOZACAS-NEXT: lr.w.aqrl a2, (a0)
; RV32IA-NOZACAS-NEXT: and a3, a2, a1
; RV32IA-NOZACAS-NEXT: not a3, a3
; RV32IA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV32IA-NOZACAS-NEXT: bnez a3, .LBB154_1
; RV32IA-NOZACAS-NEXT: # %bb.2:
; RV32IA-NOZACAS-NEXT: mv a0, a2
; RV32IA-NOZACAS-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_nand_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.w.aqrl a2, (a0)
; RV64IA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-NOZACAS-NEXT: not a3, a3
; RV64IA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-NOZACAS-NEXT: bnez a3, .LBB154_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: mv a0, a2
; RV64IA-NOZACAS-NEXT: ret
;
; RV32IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV32IA-WMO-ZACAS: # %bb.0:
; RV32IA-WMO-ZACAS-NEXT: mv a2, a0
; RV32IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-WMO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV32IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-WMO-ZACAS-NEXT: mv a3, a0
; RV32IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-WMO-ZACAS-NEXT: not a4, a4
; RV32IA-WMO-ZACAS-NEXT: fence rw, rw
; RV32IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV32IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV32IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-WMO-ZACAS-NEXT: ret
;
; RV32IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV32IA-TSO-ZACAS: # %bb.0:
; RV32IA-TSO-ZACAS-NEXT: mv a2, a0
; RV32IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV32IA-TSO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV32IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-TSO-ZACAS-NEXT: mv a3, a0
; RV32IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV32IA-TSO-ZACAS-NEXT: not a4, a4
; RV32IA-TSO-ZACAS-NEXT: fence rw, rw
; RV32IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV32IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV32IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV32IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB154_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB154_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.w.aqrl a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.w.rl a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB154_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.w.aqrl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i32_seq_cst:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: lw a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB154_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.w a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB154_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_or_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amoor.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_or_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_or_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoor.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw or ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_or_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_or_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoor.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_or_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_or_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_or_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoor.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_or_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_or_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_or_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_or_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_or_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_or_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_or_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_or_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_or_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 0
; RV32I-NEXT: call __atomic_fetch_xor_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amoxor.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_xor_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_xor_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoxor.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw xor ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_xor_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 2
; RV32I-NEXT: call __atomic_fetch_xor_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoxor.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_xor_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_xor_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 3
; RV32I-NEXT: call __atomic_fetch_xor_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoxor.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_xor_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 4
; RV32I-NEXT: call __atomic_fetch_xor_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_xor_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_xor_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a2, 5
; RV32I-NEXT: call __atomic_fetch_xor_4
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_xor_4
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB165_2
; RV32I-NEXT: .LBB165_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB165_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB165_4
; RV32I-NEXT: .LBB165_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s1, a3, .LBB165_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB165_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB165_1
; RV32I-NEXT: .LBB165_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amomax.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB165_2
; RV64I-NEXT: .LBB165_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB165_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB165_4
; RV64I-NEXT: .LBB165_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a3, .LBB165_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB165_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB165_1
; RV64I-NEXT: .LBB165_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomax.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw max ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_max_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB166_2
; RV32I-NEXT: .LBB166_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB166_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB166_4
; RV32I-NEXT: .LBB166_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s1, a3, .LBB166_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB166_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB166_1
; RV32I-NEXT: .LBB166_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomax.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB166_2
; RV64I-NEXT: .LBB166_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB166_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB166_4
; RV64I-NEXT: .LBB166_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a3, .LBB166_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB166_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB166_1
; RV64I-NEXT: .LBB166_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_max_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB167_2
; RV32I-NEXT: .LBB167_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB167_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB167_4
; RV32I-NEXT: .LBB167_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s1, a3, .LBB167_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB167_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB167_1
; RV32I-NEXT: .LBB167_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomax.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB167_2
; RV64I-NEXT: .LBB167_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB167_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB167_4
; RV64I-NEXT: .LBB167_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a3, .LBB167_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB167_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB167_1
; RV64I-NEXT: .LBB167_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_max_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB168_2
; RV32I-NEXT: .LBB168_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB168_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB168_4
; RV32I-NEXT: .LBB168_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s1, a3, .LBB168_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB168_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB168_1
; RV32I-NEXT: .LBB168_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB168_2
; RV64I-NEXT: .LBB168_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB168_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB168_4
; RV64I-NEXT: .LBB168_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a3, .LBB168_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB168_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB168_1
; RV64I-NEXT: .LBB168_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB169_2
; RV32I-NEXT: .LBB169_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB169_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB169_4
; RV32I-NEXT: .LBB169_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: blt s1, a3, .LBB169_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB169_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB169_1
; RV32I-NEXT: .LBB169_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_max_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_max_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB169_2
; RV64I-NEXT: .LBB169_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB169_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB169_4
; RV64I-NEXT: .LBB169_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s2, a3, .LBB169_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB169_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB169_1
; RV64I-NEXT: .LBB169_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB170_2
; RV32I-NEXT: .LBB170_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB170_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB170_4
; RV32I-NEXT: .LBB170_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s1, a3, .LBB170_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB170_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB170_1
; RV32I-NEXT: .LBB170_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amomin.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB170_2
; RV64I-NEXT: .LBB170_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB170_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB170_4
; RV64I-NEXT: .LBB170_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a3, .LBB170_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB170_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB170_1
; RV64I-NEXT: .LBB170_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomin.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw min ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_min_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB171_2
; RV32I-NEXT: .LBB171_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB171_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB171_4
; RV32I-NEXT: .LBB171_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s1, a3, .LBB171_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB171_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB171_1
; RV32I-NEXT: .LBB171_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomin.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB171_2
; RV64I-NEXT: .LBB171_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB171_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB171_4
; RV64I-NEXT: .LBB171_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a3, .LBB171_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB171_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB171_1
; RV64I-NEXT: .LBB171_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_min_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB172_2
; RV32I-NEXT: .LBB172_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB172_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB172_4
; RV32I-NEXT: .LBB172_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s1, a3, .LBB172_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB172_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB172_1
; RV32I-NEXT: .LBB172_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomin.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB172_2
; RV64I-NEXT: .LBB172_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB172_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB172_4
; RV64I-NEXT: .LBB172_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a3, .LBB172_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB172_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB172_1
; RV64I-NEXT: .LBB172_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_min_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB173_2
; RV32I-NEXT: .LBB173_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB173_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB173_4
; RV32I-NEXT: .LBB173_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s1, a3, .LBB173_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB173_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB173_1
; RV32I-NEXT: .LBB173_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB173_2
; RV64I-NEXT: .LBB173_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB173_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB173_4
; RV64I-NEXT: .LBB173_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a3, .LBB173_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB173_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB173_1
; RV64I-NEXT: .LBB173_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB174_2
; RV32I-NEXT: .LBB174_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB174_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB174_4
; RV32I-NEXT: .LBB174_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bge s1, a3, .LBB174_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB174_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB174_1
; RV32I-NEXT: .LBB174_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_min_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_min_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB174_2
; RV64I-NEXT: .LBB174_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB174_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB174_4
; RV64I-NEXT: .LBB174_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s2, a3, .LBB174_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB174_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB174_1
; RV64I-NEXT: .LBB174_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB175_2
; RV32I-NEXT: .LBB175_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB175_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB175_4
; RV32I-NEXT: .LBB175_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s1, a3, .LBB175_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB175_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB175_1
; RV32I-NEXT: .LBB175_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amomaxu.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB175_2
; RV64I-NEXT: .LBB175_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB175_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB175_4
; RV64I-NEXT: .LBB175_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a3, .LBB175_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB175_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB175_1
; RV64I-NEXT: .LBB175_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomaxu.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw umax ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_umax_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB176_2
; RV32I-NEXT: .LBB176_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB176_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB176_4
; RV32I-NEXT: .LBB176_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s1, a3, .LBB176_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB176_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB176_1
; RV32I-NEXT: .LBB176_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomaxu.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB176_2
; RV64I-NEXT: .LBB176_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB176_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB176_4
; RV64I-NEXT: .LBB176_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a3, .LBB176_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB176_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB176_1
; RV64I-NEXT: .LBB176_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_umax_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB177_2
; RV32I-NEXT: .LBB177_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB177_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB177_4
; RV32I-NEXT: .LBB177_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s1, a3, .LBB177_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB177_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB177_1
; RV32I-NEXT: .LBB177_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomaxu.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB177_2
; RV64I-NEXT: .LBB177_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB177_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB177_4
; RV64I-NEXT: .LBB177_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a3, .LBB177_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB177_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB177_1
; RV64I-NEXT: .LBB177_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_umax_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB178_2
; RV32I-NEXT: .LBB178_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB178_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB178_4
; RV32I-NEXT: .LBB178_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s1, a3, .LBB178_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB178_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB178_1
; RV32I-NEXT: .LBB178_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB178_2
; RV64I-NEXT: .LBB178_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB178_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB178_4
; RV64I-NEXT: .LBB178_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a3, .LBB178_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB178_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB178_1
; RV64I-NEXT: .LBB178_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB179_2
; RV32I-NEXT: .LBB179_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB179_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB179_4
; RV32I-NEXT: .LBB179_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bltu s1, a3, .LBB179_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB179_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB179_1
; RV32I-NEXT: .LBB179_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB179_2
; RV64I-NEXT: .LBB179_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB179_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB179_4
; RV64I-NEXT: .LBB179_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s2, a3, .LBB179_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB179_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB179_1
; RV64I-NEXT: .LBB179_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i32 %b seq_cst
ret i32 %1
}
define i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i32_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB180_2
; RV32I-NEXT: .LBB180_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB180_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB180_4
; RV32I-NEXT: .LBB180_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s1, a3, .LBB180_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB180_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB180_1
; RV32I-NEXT: .LBB180_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i32_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: amominu.w a0, a1, (a0)
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i32_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB180_2
; RV64I-NEXT: .LBB180_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB180_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB180_4
; RV64I-NEXT: .LBB180_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a3, .LBB180_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB180_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB180_1
; RV64I-NEXT: .LBB180_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i32_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amominu.w a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw umin ptr %a, i32 %b monotonic
ret i32 %1
}
define i32 @atomicrmw_umin_i32_acquire(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i32_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB181_2
; RV32I-NEXT: .LBB181_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB181_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB181_4
; RV32I-NEXT: .LBB181_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s1, a3, .LBB181_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB181_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB181_1
; RV32I-NEXT: .LBB181_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acquire:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amominu.w.aq a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acquire:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i32_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB181_2
; RV64I-NEXT: .LBB181_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB181_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB181_4
; RV64I-NEXT: .LBB181_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a3, .LBB181_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB181_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB181_1
; RV64I-NEXT: .LBB181_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.w.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i32 %b acquire
ret i32 %1
}
define i32 @atomicrmw_umin_i32_release(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i32_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB182_2
; RV32I-NEXT: .LBB182_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB182_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB182_4
; RV32I-NEXT: .LBB182_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s1, a3, .LBB182_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB182_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB182_1
; RV32I-NEXT: .LBB182_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i32_release:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amominu.w.rl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i32_release:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i32_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB182_2
; RV64I-NEXT: .LBB182_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB182_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB182_4
; RV64I-NEXT: .LBB182_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a3, .LBB182_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB182_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB182_1
; RV64I-NEXT: .LBB182_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i32_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.w.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i32_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i32 %b release
ret i32 %1
}
define i32 @atomicrmw_umin_i32_acq_rel(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i32_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB183_2
; RV32I-NEXT: .LBB183_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB183_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB183_4
; RV32I-NEXT: .LBB183_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s1, a3, .LBB183_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB183_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB183_1
; RV32I-NEXT: .LBB183_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i32_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB183_2
; RV64I-NEXT: .LBB183_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB183_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB183_4
; RV64I-NEXT: .LBB183_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a3, .LBB183_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB183_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB183_1
; RV64I-NEXT: .LBB183_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i32_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i32_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i32 %b acq_rel
ret i32 %1
}
define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i32_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 4(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a0
; RV32I-NEXT: lw a3, 0(a0)
; RV32I-NEXT: mv s1, a1
; RV32I-NEXT: j .LBB184_2
; RV32I-NEXT: .LBB184_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB184_2 Depth=1
; RV32I-NEXT: sw a3, 0(sp)
; RV32I-NEXT: mv a1, sp
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: mv a0, s0
; RV32I-NEXT: call __atomic_compare_exchange_4
; RV32I-NEXT: lw a3, 0(sp)
; RV32I-NEXT: bnez a0, .LBB184_4
; RV32I-NEXT: .LBB184_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: mv a2, a3
; RV32I-NEXT: bgeu s1, a3, .LBB184_1
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB184_2 Depth=1
; RV32I-NEXT: mv a2, s1
; RV32I-NEXT: j .LBB184_1
; RV32I-NEXT: .LBB184_4: # %atomicrmw.end
; RV32I-NEXT: mv a0, a3
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 4(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst:
; RV32IA-WMO: # %bb.0:
; RV32IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0)
; RV32IA-WMO-NEXT: ret
;
; RV32IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst:
; RV32IA-TSO: # %bb.0:
; RV32IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV32IA-TSO-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i32_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -48
; RV64I-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s2, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: lw a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: sext.w s2, a1
; RV64I-NEXT: j .LBB184_2
; RV64I-NEXT: .LBB184_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB184_2 Depth=1
; RV64I-NEXT: sw a3, 12(sp)
; RV64I-NEXT: addi a1, sp, 12
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_4
; RV64I-NEXT: lw a3, 12(sp)
; RV64I-NEXT: bnez a0, .LBB184_4
; RV64I-NEXT: .LBB184_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s2, a3, .LBB184_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB184_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB184_1
; RV64I-NEXT: .LBB184_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s2, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 48
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i32_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.w.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i32_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.w a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i32 %b seq_cst
ret i32 %1
}
define i64 @atomicrmw_xchg_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_exchange_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_exchange_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_exchange_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_xchg_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoswap.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw xchg ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_xchg_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_exchange_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_exchange_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_exchange_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_xchg_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_exchange_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_exchange_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_exchange_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_xchg_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_exchange_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_exchange_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_exchange_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_xchg_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xchg_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_exchange_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xchg_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_exchange_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xchg_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_exchange_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xchg_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoswap.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xchg_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoswap.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xchg ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_add_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_add_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_add_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_add_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_add_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw add ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_add_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_add_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_add_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_add_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_add_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_add_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_add_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_add_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_add_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_add_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_add_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_add_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_add_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_add_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_add_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_add_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_add_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_add_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_add_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_add_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_add_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw add ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_sub_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_sub_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_sub_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_sub_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_sub_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: neg a1, a1
; RV64IA-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw sub ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_sub_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_sub_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_sub_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_sub_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_sub_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_sub_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_sub_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_sub_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_sub_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_sub_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_sub_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_sub_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_sub_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_sub_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_sub_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_sub_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_sub_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_sub_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_sub_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_sub_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: neg a1, a1
; RV64IA-WMO-NEXT: amoadd.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_sub_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: neg a1, a1
; RV64IA-TSO-NEXT: amoadd.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw sub ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_and_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_and_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_and_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_and_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_and_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoand.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw and ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_and_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_and_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_and_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_and_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_and_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_and_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_and_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_and_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_and_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_and_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_and_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_and_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_and_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_and_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_and_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_and_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_and_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_and_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_and_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_and_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoand.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_and_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoand.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw and ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_nand_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_nand_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_nand_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_nand_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-NOZACAS-NEXT: not a3, a3
; RV64IA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-NOZACAS-NEXT: bnez a3, .LBB205_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: mv a0, a2
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-ZACAS: # %bb.0:
; RV64IA-ZACAS-NEXT: mv a2, a0
; RV64IA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start
; RV64IA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-ZACAS-NEXT: mv a3, a0
; RV64IA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-ZACAS-NEXT: not a4, a4
; RV64IA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-ZACAS-NEXT: bne a0, a3, .LBB205_1
; RV64IA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB205_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB205_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB205_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB205_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_monotonic:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB205_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB205_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_nand_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_nand_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_nand_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_nand_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.d.aq a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB206_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB206_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.d.aq a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB206_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB206_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aq a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB206_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB206_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB206_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aq a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB206_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acquire:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB206_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB206_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_nand_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_nand_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_nand_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_nand_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB207_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB207_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.d.rl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB207_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB207_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB207_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB207_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB207_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.rl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB207_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_release:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB207_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB207_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_nand_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_nand_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_nand_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_nand_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-WMO-NOZACAS: # %bb.0:
; RV64IA-WMO-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-NOZACAS-NEXT: lr.d.aq a2, (a0)
; RV64IA-WMO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-WMO-NOZACAS-NEXT: bnez a3, .LBB208_1
; RV64IA-WMO-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-NOZACAS-NEXT: ret
;
; RV64IA-TSO-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-TSO-NOZACAS: # %bb.0:
; RV64IA-TSO-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-NOZACAS-NEXT: bnez a3, .LBB208_1
; RV64IA-TSO-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB208_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB208_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aq a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB208_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB208_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB208_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB208_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_acq_rel:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB208_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB208_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_nand_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_nand_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_nand_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_nand_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_nand_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_nand_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-NOZACAS: # %bb.0:
; RV64IA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1
; RV64IA-NOZACAS-NEXT: lr.d.aqrl a2, (a0)
; RV64IA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-NOZACAS-NEXT: not a3, a3
; RV64IA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-NOZACAS-NEXT: bnez a3, .LBB209_1
; RV64IA-NOZACAS-NEXT: # %bb.2:
; RV64IA-NOZACAS-NEXT: mv a0, a2
; RV64IA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-WMO-ZACAS: # %bb.0:
; RV64IA-WMO-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start
; RV64IA-WMO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
; RV64IA-WMO-ZACAS-NEXT: bne a0, a3, .LBB209_1
; RV64IA-WMO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-TSO-ZACAS: # %bb.0:
; RV64IA-TSO-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start
; RV64IA-TSO-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZACAS-NEXT: bne a0, a3, .LBB209_1
; RV64IA-TSO-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-WMO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: lr.d.aqrl a2, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB209_1
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-WMO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-NOZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-TSO-ZABHA-NOZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: .LBB209_1: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: lr.d.aqrl a2, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: and a3, a2, a1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: not a3, a3
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: sc.d.rl a3, a3, (a0)
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: bnez a3, .LBB209_1
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: # %bb.2:
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: mv a0, a2
; RV64IA-TSO-ZABHA-NOZACAS-NEXT: ret
;
; RV64IA-WMO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-WMO-ZABHA-ZACAS: # %bb.0:
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-WMO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-WMO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-WMO-ZABHA-ZACAS-NEXT: amocas.d.aqrl a0, a4, (a2)
; RV64IA-WMO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1
; RV64IA-WMO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-WMO-ZABHA-ZACAS-NEXT: ret
;
; RV64IA-TSO-ZABHA-ZACAS-LABEL: atomicrmw_nand_i64_seq_cst:
; RV64IA-TSO-ZABHA-ZACAS: # %bb.0:
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a2, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ld a0, 0(a0)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: .LBB209_1: # %atomicrmw.start
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # =>This Inner Loop Header: Depth=1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: mv a3, a0
; RV64IA-TSO-ZABHA-ZACAS-NEXT: and a4, a0, a1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: not a4, a4
; RV64IA-TSO-ZABHA-ZACAS-NEXT: fence rw, rw
; RV64IA-TSO-ZABHA-ZACAS-NEXT: amocas.d a0, a4, (a2)
; RV64IA-TSO-ZABHA-ZACAS-NEXT: bne a0, a3, .LBB209_1
; RV64IA-TSO-ZABHA-ZACAS-NEXT: # %bb.2: # %atomicrmw.end
; RV64IA-TSO-ZABHA-ZACAS-NEXT: ret
%1 = atomicrmw nand ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_or_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_or_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_or_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_or_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_or_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoor.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw or ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_or_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_or_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_or_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_or_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_or_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_or_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_or_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_or_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_or_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_or_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_or_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_or_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_or_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_or_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_or_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_or_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_or_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_or_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_or_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_or_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoor.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_or_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw or ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_xor_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 0
; RV32I-NEXT: call __atomic_fetch_xor_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 0
; RV32IA-NEXT: call __atomic_fetch_xor_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 0
; RV64I-NEXT: call __atomic_fetch_xor_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_xor_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amoxor.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw xor ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_xor_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 2
; RV32I-NEXT: call __atomic_fetch_xor_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 2
; RV32IA-NEXT: call __atomic_fetch_xor_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 2
; RV64I-NEXT: call __atomic_fetch_xor_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_xor_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 3
; RV32I-NEXT: call __atomic_fetch_xor_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 3
; RV32IA-NEXT: call __atomic_fetch_xor_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 3
; RV64I-NEXT: call __atomic_fetch_xor_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_xor_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 4
; RV32I-NEXT: call __atomic_fetch_xor_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 4
; RV32IA-NEXT: call __atomic_fetch_xor_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 4
; RV64I-NEXT: call __atomic_fetch_xor_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_xor_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_xor_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -16
; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32I-NEXT: li a3, 5
; RV32I-NEXT: call __atomic_fetch_xor_8
; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 16
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_xor_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -16
; RV32IA-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
; RV32IA-NEXT: li a3, 5
; RV32IA-NEXT: call __atomic_fetch_xor_8
; RV32IA-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 16
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_xor_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -16
; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: li a2, 5
; RV64I-NEXT: call __atomic_fetch_xor_8
; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 16
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_xor_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amoxor.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_xor_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amoxor.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw xor ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_max_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB220_2
; RV32I-NEXT: .LBB220_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB220_7
; RV32I-NEXT: .LBB220_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB220_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB220_5
; RV32I-NEXT: .LBB220_4: # in Loop: Header=BB220_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB220_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB220_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB220_1
; RV32I-NEXT: .LBB220_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB220_2
; RV32IA-NEXT: .LBB220_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a4, 0
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB220_7
; RV32IA-NEXT: .LBB220_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB220_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB220_5
; RV32IA-NEXT: .LBB220_4: # in Loop: Header=BB220_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB220_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB220_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB220_1
; RV32IA-NEXT: .LBB220_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB220_2
; RV64I-NEXT: .LBB220_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB220_4
; RV64I-NEXT: .LBB220_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s1, a3, .LBB220_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB220_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB220_1
; RV64I-NEXT: .LBB220_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_max_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomax.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw max ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_max_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB221_2
; RV32I-NEXT: .LBB221_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB221_7
; RV32I-NEXT: .LBB221_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB221_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB221_5
; RV32I-NEXT: .LBB221_4: # in Loop: Header=BB221_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB221_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB221_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB221_1
; RV32I-NEXT: .LBB221_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB221_2
; RV32IA-NEXT: .LBB221_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 2
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB221_7
; RV32IA-NEXT: .LBB221_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB221_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB221_5
; RV32IA-NEXT: .LBB221_4: # in Loop: Header=BB221_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB221_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB221_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB221_1
; RV32IA-NEXT: .LBB221_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB221_2
; RV64I-NEXT: .LBB221_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB221_4
; RV64I-NEXT: .LBB221_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s1, a3, .LBB221_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB221_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB221_1
; RV64I-NEXT: .LBB221_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_max_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB222_2
; RV32I-NEXT: .LBB222_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB222_7
; RV32I-NEXT: .LBB222_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB222_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB222_5
; RV32I-NEXT: .LBB222_4: # in Loop: Header=BB222_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB222_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB222_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB222_1
; RV32I-NEXT: .LBB222_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB222_2
; RV32IA-NEXT: .LBB222_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 3
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB222_7
; RV32IA-NEXT: .LBB222_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB222_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB222_5
; RV32IA-NEXT: .LBB222_4: # in Loop: Header=BB222_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB222_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB222_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB222_1
; RV32IA-NEXT: .LBB222_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB222_2
; RV64I-NEXT: .LBB222_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB222_4
; RV64I-NEXT: .LBB222_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s1, a3, .LBB222_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB222_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB222_1
; RV64I-NEXT: .LBB222_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_max_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB223_2
; RV32I-NEXT: .LBB223_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 4
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB223_7
; RV32I-NEXT: .LBB223_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB223_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB223_5
; RV32I-NEXT: .LBB223_4: # in Loop: Header=BB223_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB223_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB223_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB223_1
; RV32I-NEXT: .LBB223_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB223_2
; RV32IA-NEXT: .LBB223_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 4
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB223_7
; RV32IA-NEXT: .LBB223_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB223_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB223_5
; RV32IA-NEXT: .LBB223_4: # in Loop: Header=BB223_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB223_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB223_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB223_1
; RV32IA-NEXT: .LBB223_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB223_2
; RV64I-NEXT: .LBB223_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB223_4
; RV64I-NEXT: .LBB223_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s1, a3, .LBB223_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB223_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB223_1
; RV64I-NEXT: .LBB223_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_max_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_max_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB224_2
; RV32I-NEXT: .LBB224_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: li a5, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB224_7
; RV32I-NEXT: .LBB224_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB224_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB224_5
; RV32I-NEXT: .LBB224_4: # in Loop: Header=BB224_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB224_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB224_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB224_1
; RV32I-NEXT: .LBB224_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_max_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB224_2
; RV32IA-NEXT: .LBB224_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 5
; RV32IA-NEXT: li a5, 5
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB224_7
; RV32IA-NEXT: .LBB224_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB224_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB224_5
; RV32IA-NEXT: .LBB224_4: # in Loop: Header=BB224_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB224_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB224_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB224_1
; RV32IA-NEXT: .LBB224_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_max_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB224_2
; RV64I-NEXT: .LBB224_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB224_4
; RV64I-NEXT: .LBB224_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: blt s1, a3, .LBB224_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB224_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB224_1
; RV64I-NEXT: .LBB224_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_max_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomax.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_max_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomax.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw max ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_min_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB225_2
; RV32I-NEXT: .LBB225_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB225_7
; RV32I-NEXT: .LBB225_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB225_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB225_5
; RV32I-NEXT: .LBB225_4: # in Loop: Header=BB225_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB225_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB225_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB225_1
; RV32I-NEXT: .LBB225_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB225_2
; RV32IA-NEXT: .LBB225_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a4, 0
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB225_7
; RV32IA-NEXT: .LBB225_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB225_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB225_5
; RV32IA-NEXT: .LBB225_4: # in Loop: Header=BB225_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB225_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB225_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB225_1
; RV32IA-NEXT: .LBB225_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB225_2
; RV64I-NEXT: .LBB225_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB225_4
; RV64I-NEXT: .LBB225_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s1, a3, .LBB225_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB225_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB225_1
; RV64I-NEXT: .LBB225_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_min_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomin.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw min ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_min_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB226_2
; RV32I-NEXT: .LBB226_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB226_7
; RV32I-NEXT: .LBB226_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB226_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB226_5
; RV32I-NEXT: .LBB226_4: # in Loop: Header=BB226_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB226_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB226_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB226_1
; RV32I-NEXT: .LBB226_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB226_2
; RV32IA-NEXT: .LBB226_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 2
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB226_7
; RV32IA-NEXT: .LBB226_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB226_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB226_5
; RV32IA-NEXT: .LBB226_4: # in Loop: Header=BB226_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB226_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB226_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB226_1
; RV32IA-NEXT: .LBB226_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB226_2
; RV64I-NEXT: .LBB226_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB226_4
; RV64I-NEXT: .LBB226_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s1, a3, .LBB226_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB226_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB226_1
; RV64I-NEXT: .LBB226_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_min_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB227_2
; RV32I-NEXT: .LBB227_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB227_7
; RV32I-NEXT: .LBB227_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB227_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB227_5
; RV32I-NEXT: .LBB227_4: # in Loop: Header=BB227_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB227_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB227_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB227_1
; RV32I-NEXT: .LBB227_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB227_2
; RV32IA-NEXT: .LBB227_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 3
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB227_7
; RV32IA-NEXT: .LBB227_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB227_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB227_5
; RV32IA-NEXT: .LBB227_4: # in Loop: Header=BB227_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB227_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB227_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB227_1
; RV32IA-NEXT: .LBB227_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB227_2
; RV64I-NEXT: .LBB227_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB227_4
; RV64I-NEXT: .LBB227_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s1, a3, .LBB227_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB227_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB227_1
; RV64I-NEXT: .LBB227_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_min_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB228_2
; RV32I-NEXT: .LBB228_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 4
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB228_7
; RV32I-NEXT: .LBB228_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB228_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB228_5
; RV32I-NEXT: .LBB228_4: # in Loop: Header=BB228_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB228_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB228_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB228_1
; RV32I-NEXT: .LBB228_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB228_2
; RV32IA-NEXT: .LBB228_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 4
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB228_7
; RV32IA-NEXT: .LBB228_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB228_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB228_5
; RV32IA-NEXT: .LBB228_4: # in Loop: Header=BB228_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB228_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB228_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB228_1
; RV32IA-NEXT: .LBB228_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB228_2
; RV64I-NEXT: .LBB228_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB228_4
; RV64I-NEXT: .LBB228_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s1, a3, .LBB228_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB228_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB228_1
; RV64I-NEXT: .LBB228_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_min_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_min_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB229_2
; RV32I-NEXT: .LBB229_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: li a5, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB229_7
; RV32I-NEXT: .LBB229_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB229_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32I-NEXT: slt a0, s0, a5
; RV32I-NEXT: j .LBB229_5
; RV32I-NEXT: .LBB229_4: # in Loop: Header=BB229_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB229_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB229_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB229_1
; RV32I-NEXT: .LBB229_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_min_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB229_2
; RV32IA-NEXT: .LBB229_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 5
; RV32IA-NEXT: li a5, 5
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB229_7
; RV32IA-NEXT: .LBB229_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB229_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32IA-NEXT: slt a0, s0, a5
; RV32IA-NEXT: j .LBB229_5
; RV32IA-NEXT: .LBB229_4: # in Loop: Header=BB229_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB229_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB229_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB229_1
; RV32IA-NEXT: .LBB229_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_min_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB229_2
; RV64I-NEXT: .LBB229_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB229_4
; RV64I-NEXT: .LBB229_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bge s1, a3, .LBB229_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB229_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB229_1
; RV64I-NEXT: .LBB229_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_min_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomin.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_min_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomin.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw min ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_umax_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB230_2
; RV32I-NEXT: .LBB230_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB230_7
; RV32I-NEXT: .LBB230_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB230_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB230_5
; RV32I-NEXT: .LBB230_4: # in Loop: Header=BB230_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB230_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB230_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB230_1
; RV32I-NEXT: .LBB230_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB230_2
; RV32IA-NEXT: .LBB230_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a4, 0
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB230_7
; RV32IA-NEXT: .LBB230_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB230_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB230_5
; RV32IA-NEXT: .LBB230_4: # in Loop: Header=BB230_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB230_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB230_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB230_1
; RV32IA-NEXT: .LBB230_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB230_2
; RV64I-NEXT: .LBB230_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB230_4
; RV64I-NEXT: .LBB230_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s1, a3, .LBB230_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB230_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB230_1
; RV64I-NEXT: .LBB230_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umax_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amomaxu.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw umax ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_umax_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB231_2
; RV32I-NEXT: .LBB231_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB231_7
; RV32I-NEXT: .LBB231_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB231_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB231_5
; RV32I-NEXT: .LBB231_4: # in Loop: Header=BB231_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB231_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB231_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB231_1
; RV32I-NEXT: .LBB231_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB231_2
; RV32IA-NEXT: .LBB231_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 2
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB231_7
; RV32IA-NEXT: .LBB231_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB231_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB231_5
; RV32IA-NEXT: .LBB231_4: # in Loop: Header=BB231_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB231_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB231_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB231_1
; RV32IA-NEXT: .LBB231_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB231_2
; RV64I-NEXT: .LBB231_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB231_4
; RV64I-NEXT: .LBB231_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s1, a3, .LBB231_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB231_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB231_1
; RV64I-NEXT: .LBB231_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_umax_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB232_2
; RV32I-NEXT: .LBB232_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB232_7
; RV32I-NEXT: .LBB232_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB232_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB232_5
; RV32I-NEXT: .LBB232_4: # in Loop: Header=BB232_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB232_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB232_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB232_1
; RV32I-NEXT: .LBB232_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB232_2
; RV32IA-NEXT: .LBB232_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 3
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB232_7
; RV32IA-NEXT: .LBB232_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB232_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB232_5
; RV32IA-NEXT: .LBB232_4: # in Loop: Header=BB232_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB232_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB232_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB232_1
; RV32IA-NEXT: .LBB232_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB232_2
; RV64I-NEXT: .LBB232_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB232_4
; RV64I-NEXT: .LBB232_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s1, a3, .LBB232_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB232_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB232_1
; RV64I-NEXT: .LBB232_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_umax_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB233_2
; RV32I-NEXT: .LBB233_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 4
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB233_7
; RV32I-NEXT: .LBB233_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB233_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB233_5
; RV32I-NEXT: .LBB233_4: # in Loop: Header=BB233_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB233_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB233_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB233_1
; RV32I-NEXT: .LBB233_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB233_2
; RV32IA-NEXT: .LBB233_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 4
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB233_7
; RV32IA-NEXT: .LBB233_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB233_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB233_5
; RV32IA-NEXT: .LBB233_4: # in Loop: Header=BB233_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB233_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB233_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB233_1
; RV32IA-NEXT: .LBB233_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB233_2
; RV64I-NEXT: .LBB233_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB233_4
; RV64I-NEXT: .LBB233_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s1, a3, .LBB233_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB233_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB233_1
; RV64I-NEXT: .LBB233_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_umax_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umax_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB234_2
; RV32I-NEXT: .LBB234_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: li a5, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB234_7
; RV32I-NEXT: .LBB234_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB234_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB234_5
; RV32I-NEXT: .LBB234_4: # in Loop: Header=BB234_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB234_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: bnez a0, .LBB234_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB234_1
; RV32I-NEXT: .LBB234_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umax_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB234_2
; RV32IA-NEXT: .LBB234_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 5
; RV32IA-NEXT: li a5, 5
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB234_7
; RV32IA-NEXT: .LBB234_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB234_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB234_5
; RV32IA-NEXT: .LBB234_4: # in Loop: Header=BB234_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB234_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: bnez a0, .LBB234_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB234_1
; RV32IA-NEXT: .LBB234_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umax_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB234_2
; RV64I-NEXT: .LBB234_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB234_4
; RV64I-NEXT: .LBB234_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bltu s1, a3, .LBB234_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB234_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB234_1
; RV64I-NEXT: .LBB234_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umax_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amomaxu.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umax_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amomaxu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umax ptr %a, i64 %b seq_cst
ret i64 %1
}
define i64 @atomicrmw_umin_i64_monotonic(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_monotonic:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB235_2
; RV32I-NEXT: .LBB235_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a4, 0
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB235_7
; RV32I-NEXT: .LBB235_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB235_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB235_5
; RV32I-NEXT: .LBB235_4: # in Loop: Header=BB235_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB235_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB235_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB235_1
; RV32I-NEXT: .LBB235_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_monotonic:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB235_2
; RV32IA-NEXT: .LBB235_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a4, 0
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB235_7
; RV32IA-NEXT: .LBB235_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB235_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB235_5
; RV32IA-NEXT: .LBB235_4: # in Loop: Header=BB235_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB235_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB235_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB235_1
; RV32IA-NEXT: .LBB235_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_monotonic:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB235_2
; RV64I-NEXT: .LBB235_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a3, 0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB235_4
; RV64I-NEXT: .LBB235_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s1, a3, .LBB235_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB235_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB235_1
; RV64I-NEXT: .LBB235_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-LABEL: atomicrmw_umin_i64_monotonic:
; RV64IA: # %bb.0:
; RV64IA-NEXT: amominu.d a0, a1, (a0)
; RV64IA-NEXT: ret
%1 = atomicrmw umin ptr %a, i64 %b monotonic
ret i64 %1
}
define i64 @atomicrmw_umin_i64_acquire(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_acquire:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB236_2
; RV32I-NEXT: .LBB236_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 2
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB236_7
; RV32I-NEXT: .LBB236_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB236_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB236_5
; RV32I-NEXT: .LBB236_4: # in Loop: Header=BB236_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB236_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB236_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB236_1
; RV32I-NEXT: .LBB236_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_acquire:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB236_2
; RV32IA-NEXT: .LBB236_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 2
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB236_7
; RV32IA-NEXT: .LBB236_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB236_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB236_5
; RV32IA-NEXT: .LBB236_4: # in Loop: Header=BB236_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB236_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB236_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB236_1
; RV32IA-NEXT: .LBB236_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_acquire:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB236_2
; RV64I-NEXT: .LBB236_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 2
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB236_4
; RV64I-NEXT: .LBB236_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s1, a3, .LBB236_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB236_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB236_1
; RV64I-NEXT: .LBB236_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acquire:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.d.aq a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acquire:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i64 %b acquire
ret i64 %1
}
define i64 @atomicrmw_umin_i64_release(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_release:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB237_2
; RV32I-NEXT: .LBB237_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 3
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: li a5, 0
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB237_7
; RV32I-NEXT: .LBB237_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB237_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB237_5
; RV32I-NEXT: .LBB237_4: # in Loop: Header=BB237_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB237_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB237_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB237_1
; RV32I-NEXT: .LBB237_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_release:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB237_2
; RV32IA-NEXT: .LBB237_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 3
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: li a5, 0
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB237_7
; RV32IA-NEXT: .LBB237_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB237_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB237_5
; RV32IA-NEXT: .LBB237_4: # in Loop: Header=BB237_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB237_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB237_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB237_1
; RV32IA-NEXT: .LBB237_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_release:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB237_2
; RV64I-NEXT: .LBB237_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 3
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: li a4, 0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB237_4
; RV64I-NEXT: .LBB237_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s1, a3, .LBB237_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB237_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB237_1
; RV64I-NEXT: .LBB237_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i64_release:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.d.rl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i64_release:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i64 %b release
ret i64 %1
}
define i64 @atomicrmw_umin_i64_acq_rel(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_acq_rel:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB238_2
; RV32I-NEXT: .LBB238_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 4
; RV32I-NEXT: li a5, 2
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB238_7
; RV32I-NEXT: .LBB238_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB238_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB238_5
; RV32I-NEXT: .LBB238_4: # in Loop: Header=BB238_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB238_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB238_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB238_1
; RV32I-NEXT: .LBB238_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_acq_rel:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB238_2
; RV32IA-NEXT: .LBB238_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 4
; RV32IA-NEXT: li a5, 2
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB238_7
; RV32IA-NEXT: .LBB238_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB238_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB238_5
; RV32IA-NEXT: .LBB238_4: # in Loop: Header=BB238_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB238_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB238_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB238_1
; RV32IA-NEXT: .LBB238_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_acq_rel:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB238_2
; RV64I-NEXT: .LBB238_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 4
; RV64I-NEXT: li a4, 2
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB238_4
; RV64I-NEXT: .LBB238_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s1, a3, .LBB238_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB238_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB238_1
; RV64I-NEXT: .LBB238_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i64_acq_rel:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i64_acq_rel:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i64 %b acq_rel
ret i64 %1
}
define i64 @atomicrmw_umin_i64_seq_cst(ptr %a, i64 %b) nounwind {
; RV32I-LABEL: atomicrmw_umin_i64_seq_cst:
; RV32I: # %bb.0:
; RV32I-NEXT: addi sp, sp, -32
; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32I-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32I-NEXT: mv s0, a2
; RV32I-NEXT: mv s1, a0
; RV32I-NEXT: lw a4, 0(a0)
; RV32I-NEXT: lw a5, 4(a0)
; RV32I-NEXT: mv s2, a1
; RV32I-NEXT: j .LBB239_2
; RV32I-NEXT: .LBB239_1: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32I-NEXT: sw a4, 8(sp)
; RV32I-NEXT: sw a5, 12(sp)
; RV32I-NEXT: addi a1, sp, 8
; RV32I-NEXT: li a4, 5
; RV32I-NEXT: li a5, 5
; RV32I-NEXT: mv a0, s1
; RV32I-NEXT: call __atomic_compare_exchange_8
; RV32I-NEXT: lw a4, 8(sp)
; RV32I-NEXT: lw a5, 12(sp)
; RV32I-NEXT: bnez a0, .LBB239_7
; RV32I-NEXT: .LBB239_2: # %atomicrmw.start
; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
; RV32I-NEXT: beq a5, s0, .LBB239_4
; RV32I-NEXT: # %bb.3: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32I-NEXT: sltu a0, s0, a5
; RV32I-NEXT: j .LBB239_5
; RV32I-NEXT: .LBB239_4: # in Loop: Header=BB239_2 Depth=1
; RV32I-NEXT: sltu a0, s2, a4
; RV32I-NEXT: .LBB239_5: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32I-NEXT: mv a2, a4
; RV32I-NEXT: mv a3, a5
; RV32I-NEXT: beqz a0, .LBB239_1
; RV32I-NEXT: # %bb.6: # %atomicrmw.start
; RV32I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32I-NEXT: mv a2, s2
; RV32I-NEXT: mv a3, s0
; RV32I-NEXT: j .LBB239_1
; RV32I-NEXT: .LBB239_7: # %atomicrmw.end
; RV32I-NEXT: mv a0, a4
; RV32I-NEXT: mv a1, a5
; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32I-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32I-NEXT: addi sp, sp, 32
; RV32I-NEXT: ret
;
; RV32IA-LABEL: atomicrmw_umin_i64_seq_cst:
; RV32IA: # %bb.0:
; RV32IA-NEXT: addi sp, sp, -32
; RV32IA-NEXT: sw ra, 28(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s0, 24(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s1, 20(sp) # 4-byte Folded Spill
; RV32IA-NEXT: sw s2, 16(sp) # 4-byte Folded Spill
; RV32IA-NEXT: mv s0, a2
; RV32IA-NEXT: mv s1, a0
; RV32IA-NEXT: lw a4, 0(a0)
; RV32IA-NEXT: lw a5, 4(a0)
; RV32IA-NEXT: mv s2, a1
; RV32IA-NEXT: j .LBB239_2
; RV32IA-NEXT: .LBB239_1: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32IA-NEXT: sw a4, 8(sp)
; RV32IA-NEXT: sw a5, 12(sp)
; RV32IA-NEXT: addi a1, sp, 8
; RV32IA-NEXT: li a4, 5
; RV32IA-NEXT: li a5, 5
; RV32IA-NEXT: mv a0, s1
; RV32IA-NEXT: call __atomic_compare_exchange_8
; RV32IA-NEXT: lw a4, 8(sp)
; RV32IA-NEXT: lw a5, 12(sp)
; RV32IA-NEXT: bnez a0, .LBB239_7
; RV32IA-NEXT: .LBB239_2: # %atomicrmw.start
; RV32IA-NEXT: # =>This Inner Loop Header: Depth=1
; RV32IA-NEXT: beq a5, s0, .LBB239_4
; RV32IA-NEXT: # %bb.3: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32IA-NEXT: sltu a0, s0, a5
; RV32IA-NEXT: j .LBB239_5
; RV32IA-NEXT: .LBB239_4: # in Loop: Header=BB239_2 Depth=1
; RV32IA-NEXT: sltu a0, s2, a4
; RV32IA-NEXT: .LBB239_5: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32IA-NEXT: mv a2, a4
; RV32IA-NEXT: mv a3, a5
; RV32IA-NEXT: beqz a0, .LBB239_1
; RV32IA-NEXT: # %bb.6: # %atomicrmw.start
; RV32IA-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV32IA-NEXT: mv a2, s2
; RV32IA-NEXT: mv a3, s0
; RV32IA-NEXT: j .LBB239_1
; RV32IA-NEXT: .LBB239_7: # %atomicrmw.end
; RV32IA-NEXT: mv a0, a4
; RV32IA-NEXT: mv a1, a5
; RV32IA-NEXT: lw ra, 28(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s0, 24(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s1, 20(sp) # 4-byte Folded Reload
; RV32IA-NEXT: lw s2, 16(sp) # 4-byte Folded Reload
; RV32IA-NEXT: addi sp, sp, 32
; RV32IA-NEXT: ret
;
; RV64I-LABEL: atomicrmw_umin_i64_seq_cst:
; RV64I: # %bb.0:
; RV64I-NEXT: addi sp, sp, -32
; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
; RV64I-NEXT: sd s1, 8(sp) # 8-byte Folded Spill
; RV64I-NEXT: mv s0, a0
; RV64I-NEXT: ld a3, 0(a0)
; RV64I-NEXT: mv s1, a1
; RV64I-NEXT: j .LBB239_2
; RV64I-NEXT: .LBB239_1: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV64I-NEXT: sd a3, 0(sp)
; RV64I-NEXT: mv a1, sp
; RV64I-NEXT: li a3, 5
; RV64I-NEXT: li a4, 5
; RV64I-NEXT: mv a0, s0
; RV64I-NEXT: call __atomic_compare_exchange_8
; RV64I-NEXT: ld a3, 0(sp)
; RV64I-NEXT: bnez a0, .LBB239_4
; RV64I-NEXT: .LBB239_2: # %atomicrmw.start
; RV64I-NEXT: # =>This Inner Loop Header: Depth=1
; RV64I-NEXT: mv a2, a3
; RV64I-NEXT: bgeu s1, a3, .LBB239_1
; RV64I-NEXT: # %bb.3: # %atomicrmw.start
; RV64I-NEXT: # in Loop: Header=BB239_2 Depth=1
; RV64I-NEXT: mv a2, s1
; RV64I-NEXT: j .LBB239_1
; RV64I-NEXT: .LBB239_4: # %atomicrmw.end
; RV64I-NEXT: mv a0, a3
; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
; RV64I-NEXT: ld s1, 8(sp) # 8-byte Folded Reload
; RV64I-NEXT: addi sp, sp, 32
; RV64I-NEXT: ret
;
; RV64IA-WMO-LABEL: atomicrmw_umin_i64_seq_cst:
; RV64IA-WMO: # %bb.0:
; RV64IA-WMO-NEXT: amominu.d.aqrl a0, a1, (a0)
; RV64IA-WMO-NEXT: ret
;
; RV64IA-TSO-LABEL: atomicrmw_umin_i64_seq_cst:
; RV64IA-TSO: # %bb.0:
; RV64IA-TSO-NEXT: amominu.d a0, a1, (a0)
; RV64IA-TSO-NEXT: ret
%1 = atomicrmw umin ptr %a, i64 %b seq_cst
ret i64 %1
}