blob: 81cb2dd5e8184f4ced8a8772b2dd1450960f525f [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4
; RUN: llc -mtriple=xtensa -mattr=+windowed < %s | FileCheck %s --check-prefixes=XTENSA
; RUN: llc -mtriple=xtensa -mattr=+windowed,s32c1i < %s | FileCheck %s --check-prefixes=XTENSA-ATOMIC
define i8 @atomicrmw_xchg_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI0_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB0_2
; XTENSA-ATOMIC-NEXT: .LBB0_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB0_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB0_4
; XTENSA-ATOMIC-NEXT: .LBB0_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB0_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB0_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB0_1
; XTENSA-ATOMIC-NEXT: .LBB0_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_xchg_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI1_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB1_2
; XTENSA-ATOMIC-NEXT: .LBB1_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB1_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB1_4
; XTENSA-ATOMIC-NEXT: .LBB1_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB1_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB1_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB1_1
; XTENSA-ATOMIC-NEXT: .LBB1_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_xchg_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI2_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB2_2
; XTENSA-ATOMIC-NEXT: .LBB2_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB2_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB2_4
; XTENSA-ATOMIC-NEXT: .LBB2_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB2_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB2_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB2_1
; XTENSA-ATOMIC-NEXT: .LBB2_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_xchg_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI3_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB3_2
; XTENSA-ATOMIC-NEXT: .LBB3_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB3_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB3_4
; XTENSA-ATOMIC-NEXT: .LBB3_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB3_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB3_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB3_1
; XTENSA-ATOMIC-NEXT: .LBB3_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_xchg_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI4_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB4_2
; XTENSA-ATOMIC-NEXT: .LBB4_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB4_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB4_4
; XTENSA-ATOMIC-NEXT: .LBB4_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB4_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB4_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB4_1
; XTENSA-ATOMIC-NEXT: .LBB4_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_add_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI5_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB5_2
; XTENSA-ATOMIC-NEXT: .LBB5_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB5_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB5_4
; XTENSA-ATOMIC-NEXT: .LBB5_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB5_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB5_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB5_1
; XTENSA-ATOMIC-NEXT: .LBB5_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_add_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI6_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB6_2
; XTENSA-ATOMIC-NEXT: .LBB6_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB6_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB6_4
; XTENSA-ATOMIC-NEXT: .LBB6_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB6_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB6_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB6_1
; XTENSA-ATOMIC-NEXT: .LBB6_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_add_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI7_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB7_2
; XTENSA-ATOMIC-NEXT: .LBB7_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB7_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB7_4
; XTENSA-ATOMIC-NEXT: .LBB7_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB7_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB7_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB7_1
; XTENSA-ATOMIC-NEXT: .LBB7_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_add_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI8_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB8_2
; XTENSA-ATOMIC-NEXT: .LBB8_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB8_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB8_4
; XTENSA-ATOMIC-NEXT: .LBB8_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB8_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB8_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB8_1
; XTENSA-ATOMIC-NEXT: .LBB8_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_add_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI9_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB9_2
; XTENSA-ATOMIC-NEXT: .LBB9_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB9_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB9_4
; XTENSA-ATOMIC-NEXT: .LBB9_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB9_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB9_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB9_1
; XTENSA-ATOMIC-NEXT: .LBB9_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_sub_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI10_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB10_2
; XTENSA-ATOMIC-NEXT: .LBB10_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB10_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB10_4
; XTENSA-ATOMIC-NEXT: .LBB10_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB10_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB10_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB10_1
; XTENSA-ATOMIC-NEXT: .LBB10_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_sub_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI11_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB11_2
; XTENSA-ATOMIC-NEXT: .LBB11_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB11_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB11_4
; XTENSA-ATOMIC-NEXT: .LBB11_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB11_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB11_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB11_1
; XTENSA-ATOMIC-NEXT: .LBB11_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_sub_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI12_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB12_2
; XTENSA-ATOMIC-NEXT: .LBB12_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB12_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB12_4
; XTENSA-ATOMIC-NEXT: .LBB12_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB12_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB12_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB12_1
; XTENSA-ATOMIC-NEXT: .LBB12_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_sub_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI13_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB13_2
; XTENSA-ATOMIC-NEXT: .LBB13_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB13_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB13_4
; XTENSA-ATOMIC-NEXT: .LBB13_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB13_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB13_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB13_1
; XTENSA-ATOMIC-NEXT: .LBB13_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_sub_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI14_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB14_2
; XTENSA-ATOMIC-NEXT: .LBB14_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB14_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB14_4
; XTENSA-ATOMIC-NEXT: .LBB14_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB14_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB14_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB14_1
; XTENSA-ATOMIC-NEXT: .LBB14_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_and_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI15_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB15_2
; XTENSA-ATOMIC-NEXT: .LBB15_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB15_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB15_4
; XTENSA-ATOMIC-NEXT: .LBB15_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB15_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB15_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB15_1
; XTENSA-ATOMIC-NEXT: .LBB15_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_and_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI16_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB16_2
; XTENSA-ATOMIC-NEXT: .LBB16_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB16_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB16_4
; XTENSA-ATOMIC-NEXT: .LBB16_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB16_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB16_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB16_1
; XTENSA-ATOMIC-NEXT: .LBB16_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_and_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI17_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB17_2
; XTENSA-ATOMIC-NEXT: .LBB17_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB17_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB17_4
; XTENSA-ATOMIC-NEXT: .LBB17_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB17_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB17_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB17_1
; XTENSA-ATOMIC-NEXT: .LBB17_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_and_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI18_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB18_2
; XTENSA-ATOMIC-NEXT: .LBB18_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB18_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB18_4
; XTENSA-ATOMIC-NEXT: .LBB18_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB18_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB18_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB18_1
; XTENSA-ATOMIC-NEXT: .LBB18_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_and_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI19_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB19_2
; XTENSA-ATOMIC-NEXT: .LBB19_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB19_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB19_4
; XTENSA-ATOMIC-NEXT: .LBB19_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB19_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB19_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB19_1
; XTENSA-ATOMIC-NEXT: .LBB19_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_nand_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI20_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB20_2
; XTENSA-ATOMIC-NEXT: .LBB20_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB20_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB20_4
; XTENSA-ATOMIC-NEXT: .LBB20_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB20_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB20_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB20_1
; XTENSA-ATOMIC-NEXT: .LBB20_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_nand_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI21_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB21_2
; XTENSA-ATOMIC-NEXT: .LBB21_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB21_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB21_4
; XTENSA-ATOMIC-NEXT: .LBB21_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB21_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB21_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB21_1
; XTENSA-ATOMIC-NEXT: .LBB21_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_nand_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI22_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB22_2
; XTENSA-ATOMIC-NEXT: .LBB22_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB22_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB22_4
; XTENSA-ATOMIC-NEXT: .LBB22_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB22_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB22_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB22_1
; XTENSA-ATOMIC-NEXT: .LBB22_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_nand_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI23_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB23_2
; XTENSA-ATOMIC-NEXT: .LBB23_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB23_4
; XTENSA-ATOMIC-NEXT: .LBB23_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB23_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB23_1
; XTENSA-ATOMIC-NEXT: .LBB23_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_nand_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI24_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a10, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB24_2
; XTENSA-ATOMIC-NEXT: .LBB24_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB24_4
; XTENSA-ATOMIC-NEXT: .LBB24_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB24_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB24_1
; XTENSA-ATOMIC-NEXT: .LBB24_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_or_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI25_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB25_2
; XTENSA-ATOMIC-NEXT: .LBB25_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB25_4
; XTENSA-ATOMIC-NEXT: .LBB25_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB25_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB25_1
; XTENSA-ATOMIC-NEXT: .LBB25_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_or_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI26_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB26_2
; XTENSA-ATOMIC-NEXT: .LBB26_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB26_4
; XTENSA-ATOMIC-NEXT: .LBB26_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB26_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB26_1
; XTENSA-ATOMIC-NEXT: .LBB26_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_or_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI27_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB27_2
; XTENSA-ATOMIC-NEXT: .LBB27_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB27_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB27_4
; XTENSA-ATOMIC-NEXT: .LBB27_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB27_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB27_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB27_1
; XTENSA-ATOMIC-NEXT: .LBB27_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_or_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI28_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB28_2
; XTENSA-ATOMIC-NEXT: .LBB28_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB28_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB28_4
; XTENSA-ATOMIC-NEXT: .LBB28_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB28_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB28_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB28_1
; XTENSA-ATOMIC-NEXT: .LBB28_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_or_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI29_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB29_2
; XTENSA-ATOMIC-NEXT: .LBB29_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB29_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB29_4
; XTENSA-ATOMIC-NEXT: .LBB29_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB29_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB29_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB29_1
; XTENSA-ATOMIC-NEXT: .LBB29_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_xor_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI30_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB30_2
; XTENSA-ATOMIC-NEXT: .LBB30_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB30_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB30_4
; XTENSA-ATOMIC-NEXT: .LBB30_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB30_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB30_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB30_1
; XTENSA-ATOMIC-NEXT: .LBB30_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_xor_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI31_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB31_2
; XTENSA-ATOMIC-NEXT: .LBB31_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB31_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB31_4
; XTENSA-ATOMIC-NEXT: .LBB31_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB31_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB31_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB31_1
; XTENSA-ATOMIC-NEXT: .LBB31_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_xor_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI32_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB32_2
; XTENSA-ATOMIC-NEXT: .LBB32_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB32_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB32_4
; XTENSA-ATOMIC-NEXT: .LBB32_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB32_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB32_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB32_1
; XTENSA-ATOMIC-NEXT: .LBB32_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_xor_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI33_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB33_2
; XTENSA-ATOMIC-NEXT: .LBB33_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB33_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB33_4
; XTENSA-ATOMIC-NEXT: .LBB33_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB33_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB33_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB33_1
; XTENSA-ATOMIC-NEXT: .LBB33_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_xor_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI34_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 255
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB34_2
; XTENSA-ATOMIC-NEXT: .LBB34_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB34_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB34_4
; XTENSA-ATOMIC-NEXT: .LBB34_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB34_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB34_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB34_1
; XTENSA-ATOMIC-NEXT: .LBB34_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_max_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a4, .LCPI35_0
; XTENSA-NEXT: j .LBB35_2
; XTENSA-NEXT: .LBB35_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB35_4
; XTENSA-NEXT: .LBB35_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB35_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB35_1
; XTENSA-NEXT: .LBB35_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB35_2
; XTENSA-ATOMIC-NEXT: .LBB35_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB35_6
; XTENSA-ATOMIC-NEXT: .LBB35_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bge a12, a5, .LBB35_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB35_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB35_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB35_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB35_1
; XTENSA-ATOMIC-NEXT: .LBB35_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_max_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a4, .LCPI36_0
; XTENSA-NEXT: j .LBB36_2
; XTENSA-NEXT: .LBB36_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB36_4
; XTENSA-NEXT: .LBB36_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB36_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB36_1
; XTENSA-NEXT: .LBB36_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB36_2
; XTENSA-ATOMIC-NEXT: .LBB36_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB36_6
; XTENSA-ATOMIC-NEXT: .LBB36_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bge a12, a5, .LBB36_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB36_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB36_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB36_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB36_1
; XTENSA-ATOMIC-NEXT: .LBB36_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_max_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l8ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 24
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a5, .LCPI37_0
; XTENSA-NEXT: j .LBB37_2
; XTENSA-NEXT: .LBB37_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB37_4
; XTENSA-NEXT: .LBB37_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bge a4, a8, .LBB37_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB37_1
; XTENSA-NEXT: .LBB37_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB37_2
; XTENSA-ATOMIC-NEXT: .LBB37_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB37_6
; XTENSA-ATOMIC-NEXT: .LBB37_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bge a12, a5, .LBB37_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB37_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB37_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB37_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB37_1
; XTENSA-ATOMIC-NEXT: .LBB37_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_max_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l8ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 24
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a5, .LCPI38_0
; XTENSA-NEXT: j .LBB38_2
; XTENSA-NEXT: .LBB38_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB38_4
; XTENSA-NEXT: .LBB38_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bge a4, a8, .LBB38_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB38_1
; XTENSA-NEXT: .LBB38_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB38_2
; XTENSA-ATOMIC-NEXT: .LBB38_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB38_6
; XTENSA-ATOMIC-NEXT: .LBB38_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bge a12, a5, .LBB38_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB38_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB38_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB38_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB38_1
; XTENSA-ATOMIC-NEXT: .LBB38_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_max_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI39_0
; XTENSA-NEXT: j .LBB39_2
; XTENSA-NEXT: .LBB39_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB39_4
; XTENSA-NEXT: .LBB39_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB39_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB39_1
; XTENSA-NEXT: .LBB39_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB39_2
; XTENSA-ATOMIC-NEXT: .LBB39_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB39_6
; XTENSA-ATOMIC-NEXT: .LBB39_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bge a12, a5, .LBB39_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB39_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB39_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB39_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB39_1
; XTENSA-ATOMIC-NEXT: .LBB39_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_min_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a4, .LCPI40_0
; XTENSA-NEXT: j .LBB40_2
; XTENSA-NEXT: .LBB40_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB40_4
; XTENSA-NEXT: .LBB40_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB40_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB40_1
; XTENSA-NEXT: .LBB40_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB40_2
; XTENSA-ATOMIC-NEXT: .LBB40_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB40_6
; XTENSA-ATOMIC-NEXT: .LBB40_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: blt a12, a5, .LBB40_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB40_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB40_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB40_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB40_1
; XTENSA-ATOMIC-NEXT: .LBB40_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_min_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a4, .LCPI41_0
; XTENSA-NEXT: j .LBB41_2
; XTENSA-NEXT: .LBB41_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB41_4
; XTENSA-NEXT: .LBB41_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB41_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB41_1
; XTENSA-NEXT: .LBB41_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB41_2
; XTENSA-ATOMIC-NEXT: .LBB41_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB41_6
; XTENSA-ATOMIC-NEXT: .LBB41_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: blt a12, a5, .LBB41_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB41_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB41_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB41_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB41_1
; XTENSA-ATOMIC-NEXT: .LBB41_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_min_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l8ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 24
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a5, .LCPI42_0
; XTENSA-NEXT: j .LBB42_2
; XTENSA-NEXT: .LBB42_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB42_4
; XTENSA-NEXT: .LBB42_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: blt a4, a8, .LBB42_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB42_1
; XTENSA-NEXT: .LBB42_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB42_2
; XTENSA-ATOMIC-NEXT: .LBB42_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB42_6
; XTENSA-ATOMIC-NEXT: .LBB42_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: blt a12, a5, .LBB42_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB42_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB42_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB42_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB42_1
; XTENSA-ATOMIC-NEXT: .LBB42_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_min_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l8ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 24
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a5, .LCPI43_0
; XTENSA-NEXT: j .LBB43_2
; XTENSA-NEXT: .LBB43_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB43_4
; XTENSA-NEXT: .LBB43_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: blt a4, a8, .LBB43_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB43_1
; XTENSA-NEXT: .LBB43_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB43_2
; XTENSA-ATOMIC-NEXT: .LBB43_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB43_6
; XTENSA-ATOMIC-NEXT: .LBB43_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: blt a12, a5, .LBB43_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB43_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB43_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB43_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB43_1
; XTENSA-ATOMIC-NEXT: .LBB43_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_min_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l8ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 24
; XTENSA-NEXT: srai a5, a8, 24
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI44_0
; XTENSA-NEXT: j .LBB44_2
; XTENSA-NEXT: .LBB44_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB44_4
; XTENSA-NEXT: .LBB44_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 24
; XTENSA-NEXT: srai a8, a8, 24
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB44_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB44_1
; XTENSA-NEXT: .LBB44_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: slli a12, a3, 24
; XTENSA-ATOMIC-NEXT: srai a12, a12, 24
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB44_2
; XTENSA-ATOMIC-NEXT: .LBB44_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB44_6
; XTENSA-ATOMIC-NEXT: .LBB44_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: slli a6, a7, 24
; XTENSA-ATOMIC-NEXT: srai a5, a6, 24
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: blt a12, a5, .LBB44_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB44_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB44_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB44_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB44_1
; XTENSA-ATOMIC-NEXT: .LBB44_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_umax_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a6, .LCPI45_0
; XTENSA-NEXT: j .LBB45_2
; XTENSA-NEXT: .LBB45_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB45_4
; XTENSA-NEXT: .LBB45_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a4, a8, .LBB45_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB45_1
; XTENSA-NEXT: .LBB45_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB45_2
; XTENSA-ATOMIC-NEXT: .LBB45_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB45_6
; XTENSA-ATOMIC-NEXT: .LBB45_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a12, a5, .LBB45_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB45_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB45_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB45_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB45_1
; XTENSA-ATOMIC-NEXT: .LBB45_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_umax_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a6, .LCPI46_0
; XTENSA-NEXT: j .LBB46_2
; XTENSA-NEXT: .LBB46_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB46_4
; XTENSA-NEXT: .LBB46_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a4, a8, .LBB46_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB46_1
; XTENSA-NEXT: .LBB46_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB46_2
; XTENSA-ATOMIC-NEXT: .LBB46_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB46_6
; XTENSA-ATOMIC-NEXT: .LBB46_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a12, a5, .LBB46_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB46_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB46_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB46_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB46_1
; XTENSA-ATOMIC-NEXT: .LBB46_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_umax_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: s32i a2, a1, 4 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a4, 255
; XTENSA-NEXT: or a5, a3, a3
; XTENSA-NEXT: and a8, a3, a4
; XTENSA-NEXT: s32i a8, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a3, .LCPI47_0
; XTENSA-NEXT: j .LBB47_2
; XTENSA-NEXT: .LBB47_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 8
; XTENSA-NEXT: l32i a10, a1, 4 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a3
; XTENSA-NEXT: l8ui a2, a1, 8
; XTENSA-NEXT: bnez a10, .LBB47_4
; XTENSA-NEXT: .LBB47_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 8
; XTENSA-NEXT: and a8, a2, a4
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: l32i a9, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bgeu a9, a8, .LBB47_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB47_1
; XTENSA-NEXT: .LBB47_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB47_2
; XTENSA-ATOMIC-NEXT: .LBB47_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB47_6
; XTENSA-ATOMIC-NEXT: .LBB47_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a12, a5, .LBB47_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB47_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB47_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB47_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB47_1
; XTENSA-ATOMIC-NEXT: .LBB47_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_umax_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: s32i a2, a1, 4 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a4, 255
; XTENSA-NEXT: or a5, a3, a3
; XTENSA-NEXT: and a8, a3, a4
; XTENSA-NEXT: s32i a8, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a3, .LCPI48_0
; XTENSA-NEXT: j .LBB48_2
; XTENSA-NEXT: .LBB48_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 8
; XTENSA-NEXT: l32i a10, a1, 4 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a3
; XTENSA-NEXT: l8ui a2, a1, 8
; XTENSA-NEXT: bnez a10, .LBB48_4
; XTENSA-NEXT: .LBB48_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 8
; XTENSA-NEXT: and a8, a2, a4
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: l32i a9, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bgeu a9, a8, .LBB48_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB48_1
; XTENSA-NEXT: .LBB48_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB48_2
; XTENSA-ATOMIC-NEXT: .LBB48_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB48_6
; XTENSA-ATOMIC-NEXT: .LBB48_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a12, a5, .LBB48_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB48_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB48_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB48_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB48_1
; XTENSA-ATOMIC-NEXT: .LBB48_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_umax_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a6, .LCPI49_0
; XTENSA-NEXT: j .LBB49_2
; XTENSA-NEXT: .LBB49_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB49_4
; XTENSA-NEXT: .LBB49_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a4, a8, .LBB49_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB49_1
; XTENSA-NEXT: .LBB49_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB49_2
; XTENSA-ATOMIC-NEXT: .LBB49_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB49_6
; XTENSA-ATOMIC-NEXT: .LBB49_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a12, a5, .LBB49_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB49_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB49_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB49_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB49_1
; XTENSA-ATOMIC-NEXT: .LBB49_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i8 %b seq_cst
ret i8 %res
}
define i8 @atomicrmw_umin_i8_monotonic(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i8_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a6, .LCPI50_0
; XTENSA-NEXT: j .LBB50_2
; XTENSA-NEXT: .LBB50_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB50_4
; XTENSA-NEXT: .LBB50_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a4, a8, .LBB50_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB50_1
; XTENSA-NEXT: .LBB50_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i8_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB50_2
; XTENSA-ATOMIC-NEXT: .LBB50_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB50_6
; XTENSA-ATOMIC-NEXT: .LBB50_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a12, a5, .LBB50_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB50_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB50_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB50_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB50_1
; XTENSA-ATOMIC-NEXT: .LBB50_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i8 %b monotonic
ret i8 %res
}
define i8 @atomicrmw_umin_i8_acquire(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i8_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a6, .LCPI51_0
; XTENSA-NEXT: j .LBB51_2
; XTENSA-NEXT: .LBB51_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB51_4
; XTENSA-NEXT: .LBB51_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a4, a8, .LBB51_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB51_1
; XTENSA-NEXT: .LBB51_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i8_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB51_2
; XTENSA-ATOMIC-NEXT: .LBB51_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB51_6
; XTENSA-ATOMIC-NEXT: .LBB51_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a12, a5, .LBB51_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB51_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB51_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB51_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB51_1
; XTENSA-ATOMIC-NEXT: .LBB51_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i8 %b acquire
ret i8 %res
}
define i8 @atomicrmw_umin_i8_release(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i8_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: s32i a2, a1, 4 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a4, 255
; XTENSA-NEXT: or a5, a3, a3
; XTENSA-NEXT: and a8, a3, a4
; XTENSA-NEXT: s32i a8, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a3, .LCPI52_0
; XTENSA-NEXT: j .LBB52_2
; XTENSA-NEXT: .LBB52_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 8
; XTENSA-NEXT: l32i a10, a1, 4 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a3
; XTENSA-NEXT: l8ui a2, a1, 8
; XTENSA-NEXT: bnez a10, .LBB52_4
; XTENSA-NEXT: .LBB52_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 8
; XTENSA-NEXT: and a8, a2, a4
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: l32i a9, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bltu a9, a8, .LBB52_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB52_1
; XTENSA-NEXT: .LBB52_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i8_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB52_2
; XTENSA-ATOMIC-NEXT: .LBB52_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB52_6
; XTENSA-ATOMIC-NEXT: .LBB52_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a12, a5, .LBB52_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB52_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB52_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB52_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB52_1
; XTENSA-ATOMIC-NEXT: .LBB52_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i8 %b release
ret i8 %res
}
define i8 @atomicrmw_umin_i8_acq_rel(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i8_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: s32i a2, a1, 4 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a4, 255
; XTENSA-NEXT: or a5, a3, a3
; XTENSA-NEXT: and a8, a3, a4
; XTENSA-NEXT: s32i a8, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a3, .LCPI53_0
; XTENSA-NEXT: j .LBB53_2
; XTENSA-NEXT: .LBB53_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 8
; XTENSA-NEXT: l32i a10, a1, 4 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a3
; XTENSA-NEXT: l8ui a2, a1, 8
; XTENSA-NEXT: bnez a10, .LBB53_4
; XTENSA-NEXT: .LBB53_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 8
; XTENSA-NEXT: and a8, a2, a4
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: l32i a9, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bltu a9, a8, .LBB53_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB53_1
; XTENSA-NEXT: .LBB53_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i8_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB53_2
; XTENSA-ATOMIC-NEXT: .LBB53_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB53_6
; XTENSA-ATOMIC-NEXT: .LBB53_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a12, a5, .LBB53_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB53_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB53_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB53_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB53_1
; XTENSA-ATOMIC-NEXT: .LBB53_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i8 %b acq_rel
ret i8 %res
}
define i8 @atomicrmw_umin_i8_seq_cst(ptr %a, i8 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i8_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a8, a3, a3
; XTENSA-NEXT: s32i a2, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: l8ui a2, a2, 0
; XTENSA-NEXT: movi a5, 255
; XTENSA-NEXT: and a4, a8, a5
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a6, .LCPI54_0
; XTENSA-NEXT: j .LBB54_2
; XTENSA-NEXT: .LBB54_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: l32i a10, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: l8ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB54_4
; XTENSA-NEXT: .LBB54_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s8i a2, a1, 4
; XTENSA-NEXT: and a8, a2, a5
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a4, a8, .LBB54_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB54_1
; XTENSA-NEXT: .LBB54_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i8_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: movi a9, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: and a12, a3, a9
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB54_2
; XTENSA-ATOMIC-NEXT: .LBB54_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB54_6
; XTENSA-ATOMIC-NEXT: .LBB54_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a7, a15
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: or a6, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a12, a5, .LBB54_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a7, a7
; XTENSA-ATOMIC-NEXT: .LBB54_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a6, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a7, a7
; XTENSA-ATOMIC-NEXT: and a6, a15, a10
; XTENSA-ATOMIC-NEXT: or a7, a6, a7
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a11, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB54_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB54_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB54_1
; XTENSA-ATOMIC-NEXT: .LBB54_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i8 %b seq_cst
ret i8 %res
}
define i16 @atomicrmw_xchg_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI55_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI55_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB55_2
; XTENSA-ATOMIC-NEXT: .LBB55_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB55_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB55_4
; XTENSA-ATOMIC-NEXT: .LBB55_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB55_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB55_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB55_1
; XTENSA-ATOMIC-NEXT: .LBB55_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_xchg_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI56_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI56_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB56_2
; XTENSA-ATOMIC-NEXT: .LBB56_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB56_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB56_4
; XTENSA-ATOMIC-NEXT: .LBB56_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB56_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB56_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB56_1
; XTENSA-ATOMIC-NEXT: .LBB56_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_xchg_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI57_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI57_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB57_2
; XTENSA-ATOMIC-NEXT: .LBB57_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB57_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB57_4
; XTENSA-ATOMIC-NEXT: .LBB57_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB57_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB57_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB57_1
; XTENSA-ATOMIC-NEXT: .LBB57_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_xchg_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI58_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI58_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB58_2
; XTENSA-ATOMIC-NEXT: .LBB58_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB58_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB58_4
; XTENSA-ATOMIC-NEXT: .LBB58_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB58_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB58_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB58_1
; XTENSA-ATOMIC-NEXT: .LBB58_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_xchg_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI59_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI59_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a10, a10, a11
; XTENSA-ATOMIC-NEXT: movi a11, -4
; XTENSA-ATOMIC-NEXT: and a11, a2, a11
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB59_2
; XTENSA-ATOMIC-NEXT: .LBB59_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB59_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB59_4
; XTENSA-ATOMIC-NEXT: .LBB59_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a15, a10
; XTENSA-ATOMIC-NEXT: or a14, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a11, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB59_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB59_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB59_1
; XTENSA-ATOMIC-NEXT: .LBB59_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_add_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI60_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI60_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB60_2
; XTENSA-ATOMIC-NEXT: .LBB60_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB60_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB60_4
; XTENSA-ATOMIC-NEXT: .LBB60_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB60_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB60_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB60_1
; XTENSA-ATOMIC-NEXT: .LBB60_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_add_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI61_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI61_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB61_2
; XTENSA-ATOMIC-NEXT: .LBB61_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB61_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB61_4
; XTENSA-ATOMIC-NEXT: .LBB61_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB61_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB61_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB61_1
; XTENSA-ATOMIC-NEXT: .LBB61_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_add_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI62_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI62_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB62_2
; XTENSA-ATOMIC-NEXT: .LBB62_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB62_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB62_4
; XTENSA-ATOMIC-NEXT: .LBB62_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB62_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB62_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB62_1
; XTENSA-ATOMIC-NEXT: .LBB62_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_add_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI63_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI63_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB63_2
; XTENSA-ATOMIC-NEXT: .LBB63_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB63_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB63_4
; XTENSA-ATOMIC-NEXT: .LBB63_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB63_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB63_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB63_1
; XTENSA-ATOMIC-NEXT: .LBB63_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_add_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI64_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI64_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB64_2
; XTENSA-ATOMIC-NEXT: .LBB64_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB64_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB64_4
; XTENSA-ATOMIC-NEXT: .LBB64_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: add a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB64_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB64_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB64_1
; XTENSA-ATOMIC-NEXT: .LBB64_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_sub_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI65_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI65_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB65_2
; XTENSA-ATOMIC-NEXT: .LBB65_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB65_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB65_4
; XTENSA-ATOMIC-NEXT: .LBB65_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB65_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB65_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB65_1
; XTENSA-ATOMIC-NEXT: .LBB65_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_sub_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI66_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI66_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB66_2
; XTENSA-ATOMIC-NEXT: .LBB66_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB66_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB66_4
; XTENSA-ATOMIC-NEXT: .LBB66_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB66_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB66_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB66_1
; XTENSA-ATOMIC-NEXT: .LBB66_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_sub_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI67_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI67_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB67_2
; XTENSA-ATOMIC-NEXT: .LBB67_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB67_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB67_4
; XTENSA-ATOMIC-NEXT: .LBB67_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB67_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB67_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB67_1
; XTENSA-ATOMIC-NEXT: .LBB67_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_sub_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI68_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI68_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB68_2
; XTENSA-ATOMIC-NEXT: .LBB68_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB68_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB68_4
; XTENSA-ATOMIC-NEXT: .LBB68_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB68_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB68_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB68_1
; XTENSA-ATOMIC-NEXT: .LBB68_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_sub_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI69_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI69_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a11, a10, a11
; XTENSA-ATOMIC-NEXT: movi a12, -4
; XTENSA-ATOMIC-NEXT: and a12, a2, a12
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 1
; XTENSA-ATOMIC-NEXT: j .LBB69_2
; XTENSA-ATOMIC-NEXT: .LBB69_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB69_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB69_4
; XTENSA-ATOMIC-NEXT: .LBB69_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a11
; XTENSA-ATOMIC-NEXT: sub a6, a15, a9
; XTENSA-ATOMIC-NEXT: and a6, a6, a10
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a12, 0
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB69_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB69_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a13, a13
; XTENSA-ATOMIC-NEXT: j .LBB69_1
; XTENSA-ATOMIC-NEXT: .LBB69_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_and_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI70_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI70_0
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB70_2
; XTENSA-ATOMIC-NEXT: .LBB70_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB70_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB70_4
; XTENSA-ATOMIC-NEXT: .LBB70_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB70_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB70_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB70_1
; XTENSA-ATOMIC-NEXT: .LBB70_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_and_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI71_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI71_0
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB71_2
; XTENSA-ATOMIC-NEXT: .LBB71_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB71_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB71_4
; XTENSA-ATOMIC-NEXT: .LBB71_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB71_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB71_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB71_1
; XTENSA-ATOMIC-NEXT: .LBB71_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_and_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI72_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI72_0
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB72_2
; XTENSA-ATOMIC-NEXT: .LBB72_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB72_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB72_4
; XTENSA-ATOMIC-NEXT: .LBB72_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB72_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB72_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB72_1
; XTENSA-ATOMIC-NEXT: .LBB72_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_and_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI73_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI73_0
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB73_2
; XTENSA-ATOMIC-NEXT: .LBB73_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB73_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB73_4
; XTENSA-ATOMIC-NEXT: .LBB73_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB73_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB73_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB73_1
; XTENSA-ATOMIC-NEXT: .LBB73_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_and_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI74_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI74_0
; XTENSA-ATOMIC-NEXT: and a10, a3, a9
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a11
; XTENSA-ATOMIC-NEXT: or a9, a10, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB74_2
; XTENSA-ATOMIC-NEXT: .LBB74_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB74_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB74_4
; XTENSA-ATOMIC-NEXT: .LBB74_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB74_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB74_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB74_1
; XTENSA-ATOMIC-NEXT: .LBB74_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_nand_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI75_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI75_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB75_2
; XTENSA-ATOMIC-NEXT: .LBB75_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB75_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB75_4
; XTENSA-ATOMIC-NEXT: .LBB75_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB75_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB75_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB75_1
; XTENSA-ATOMIC-NEXT: .LBB75_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_nand_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI76_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI76_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB76_2
; XTENSA-ATOMIC-NEXT: .LBB76_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB76_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB76_4
; XTENSA-ATOMIC-NEXT: .LBB76_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB76_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB76_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB76_1
; XTENSA-ATOMIC-NEXT: .LBB76_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_nand_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI77_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI77_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB77_2
; XTENSA-ATOMIC-NEXT: .LBB77_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB77_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB77_4
; XTENSA-ATOMIC-NEXT: .LBB77_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB77_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB77_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB77_1
; XTENSA-ATOMIC-NEXT: .LBB77_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_nand_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI78_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI78_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB78_2
; XTENSA-ATOMIC-NEXT: .LBB78_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB78_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB78_4
; XTENSA-ATOMIC-NEXT: .LBB78_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB78_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB78_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB78_1
; XTENSA-ATOMIC-NEXT: .LBB78_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_nand_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_nand_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI79_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_nand_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a10, .LCPI79_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a10
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a11, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a11
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a10
; XTENSA-ATOMIC-NEXT: movi a11, -1
; XTENSA-ATOMIC-NEXT: xor a12, a10, a11
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; XTENSA-ATOMIC-NEXT: movi a15, 1
; XTENSA-ATOMIC-NEXT: j .LBB79_2
; XTENSA-ATOMIC-NEXT: .LBB79_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB79_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a6, a6
; XTENSA-ATOMIC-NEXT: beqi a5, 1, .LBB79_4
; XTENSA-ATOMIC-NEXT: .LBB79_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a6, a7, a12
; XTENSA-ATOMIC-NEXT: and a5, a7, a9
; XTENSA-ATOMIC-NEXT: xor a5, a5, a11
; XTENSA-ATOMIC-NEXT: and a5, a5, a10
; XTENSA-ATOMIC-NEXT: or a6, a6, a5
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a6, a13, 0
; XTENSA-ATOMIC-NEXT: or a5, a15, a15
; XTENSA-ATOMIC-NEXT: beq a6, a7, .LBB79_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB79_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a5, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB79_1
; XTENSA-ATOMIC-NEXT: .LBB79_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a6
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw nand ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_or_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI80_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI80_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB80_2
; XTENSA-ATOMIC-NEXT: .LBB80_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB80_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB80_4
; XTENSA-ATOMIC-NEXT: .LBB80_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB80_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB80_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB80_1
; XTENSA-ATOMIC-NEXT: .LBB80_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_or_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI81_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI81_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB81_2
; XTENSA-ATOMIC-NEXT: .LBB81_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB81_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB81_4
; XTENSA-ATOMIC-NEXT: .LBB81_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB81_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB81_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB81_1
; XTENSA-ATOMIC-NEXT: .LBB81_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_or_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI82_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI82_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB82_2
; XTENSA-ATOMIC-NEXT: .LBB82_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB82_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB82_4
; XTENSA-ATOMIC-NEXT: .LBB82_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB82_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB82_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB82_1
; XTENSA-ATOMIC-NEXT: .LBB82_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_or_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI83_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI83_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB83_2
; XTENSA-ATOMIC-NEXT: .LBB83_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB83_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB83_4
; XTENSA-ATOMIC-NEXT: .LBB83_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB83_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB83_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB83_1
; XTENSA-ATOMIC-NEXT: .LBB83_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_or_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI84_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI84_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB84_2
; XTENSA-ATOMIC-NEXT: .LBB84_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB84_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB84_4
; XTENSA-ATOMIC-NEXT: .LBB84_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB84_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB84_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB84_1
; XTENSA-ATOMIC-NEXT: .LBB84_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_xor_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI85_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI85_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB85_2
; XTENSA-ATOMIC-NEXT: .LBB85_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB85_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB85_4
; XTENSA-ATOMIC-NEXT: .LBB85_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB85_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB85_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB85_1
; XTENSA-ATOMIC-NEXT: .LBB85_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_xor_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI86_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI86_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB86_2
; XTENSA-ATOMIC-NEXT: .LBB86_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB86_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB86_4
; XTENSA-ATOMIC-NEXT: .LBB86_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB86_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB86_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB86_1
; XTENSA-ATOMIC-NEXT: .LBB86_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_xor_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI87_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI87_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB87_2
; XTENSA-ATOMIC-NEXT: .LBB87_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB87_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB87_4
; XTENSA-ATOMIC-NEXT: .LBB87_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB87_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB87_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB87_1
; XTENSA-ATOMIC-NEXT: .LBB87_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_xor_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI88_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI88_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB88_2
; XTENSA-ATOMIC-NEXT: .LBB88_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB88_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB88_4
; XTENSA-ATOMIC-NEXT: .LBB88_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB88_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB88_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB88_1
; XTENSA-ATOMIC-NEXT: .LBB88_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_xor_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI89_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32r a8, .LCPI89_0
; XTENSA-ATOMIC-NEXT: and a9, a3, a8
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a10, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a10
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB89_2
; XTENSA-ATOMIC-NEXT: .LBB89_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB89_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a13, a13
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB89_4
; XTENSA-ATOMIC-NEXT: .LBB89_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a13, a14, a9
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a13, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a13, a14, .LBB89_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB89_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB89_1
; XTENSA-ATOMIC-NEXT: .LBB89_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_max_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a4, .LCPI90_0
; XTENSA-NEXT: j .LBB90_2
; XTENSA-NEXT: .LBB90_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB90_4
; XTENSA-NEXT: .LBB90_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB90_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB90_1
; XTENSA-NEXT: .LBB90_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI90_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB90_2
; XTENSA-ATOMIC-NEXT: .LBB90_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB90_6
; XTENSA-ATOMIC-NEXT: .LBB90_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bge a11, a6, .LBB90_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB90_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI90_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB90_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB90_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB90_1
; XTENSA-ATOMIC-NEXT: .LBB90_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_max_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a4, .LCPI91_0
; XTENSA-NEXT: j .LBB91_2
; XTENSA-NEXT: .LBB91_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB91_4
; XTENSA-NEXT: .LBB91_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB91_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB91_1
; XTENSA-NEXT: .LBB91_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI91_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB91_2
; XTENSA-ATOMIC-NEXT: .LBB91_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB91_6
; XTENSA-ATOMIC-NEXT: .LBB91_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bge a11, a6, .LBB91_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB91_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI91_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB91_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB91_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB91_1
; XTENSA-ATOMIC-NEXT: .LBB91_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_max_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l16ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 16
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a5, .LCPI92_0
; XTENSA-NEXT: j .LBB92_2
; XTENSA-NEXT: .LBB92_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB92_4
; XTENSA-NEXT: .LBB92_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bge a4, a8, .LBB92_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB92_1
; XTENSA-NEXT: .LBB92_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI92_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB92_2
; XTENSA-ATOMIC-NEXT: .LBB92_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB92_6
; XTENSA-ATOMIC-NEXT: .LBB92_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bge a11, a6, .LBB92_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB92_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI92_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB92_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB92_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB92_1
; XTENSA-ATOMIC-NEXT: .LBB92_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_max_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l16ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 16
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a5, .LCPI93_0
; XTENSA-NEXT: j .LBB93_2
; XTENSA-NEXT: .LBB93_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB93_4
; XTENSA-NEXT: .LBB93_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: bge a4, a8, .LBB93_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB93_1
; XTENSA-NEXT: .LBB93_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI93_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB93_2
; XTENSA-ATOMIC-NEXT: .LBB93_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB93_6
; XTENSA-ATOMIC-NEXT: .LBB93_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bge a11, a6, .LBB93_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB93_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI93_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB93_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB93_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB93_1
; XTENSA-ATOMIC-NEXT: .LBB93_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_max_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI94_0
; XTENSA-NEXT: j .LBB94_2
; XTENSA-NEXT: .LBB94_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB94_4
; XTENSA-NEXT: .LBB94_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a5, a8, .LBB94_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB94_1
; XTENSA-NEXT: .LBB94_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI94_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB94_2
; XTENSA-ATOMIC-NEXT: .LBB94_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB94_6
; XTENSA-ATOMIC-NEXT: .LBB94_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bge a11, a6, .LBB94_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB94_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI94_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB94_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB94_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB94_1
; XTENSA-ATOMIC-NEXT: .LBB94_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_min_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a4, .LCPI95_0
; XTENSA-NEXT: j .LBB95_2
; XTENSA-NEXT: .LBB95_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB95_4
; XTENSA-NEXT: .LBB95_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB95_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB95_1
; XTENSA-NEXT: .LBB95_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI95_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB95_2
; XTENSA-ATOMIC-NEXT: .LBB95_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB95_6
; XTENSA-ATOMIC-NEXT: .LBB95_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: blt a11, a6, .LBB95_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB95_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI95_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB95_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB95_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB95_1
; XTENSA-ATOMIC-NEXT: .LBB95_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_min_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a4, .LCPI96_0
; XTENSA-NEXT: j .LBB96_2
; XTENSA-NEXT: .LBB96_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB96_4
; XTENSA-NEXT: .LBB96_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB96_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB96_1
; XTENSA-NEXT: .LBB96_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI96_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB96_2
; XTENSA-ATOMIC-NEXT: .LBB96_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB96_6
; XTENSA-ATOMIC-NEXT: .LBB96_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: blt a11, a6, .LBB96_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB96_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI96_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB96_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB96_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB96_1
; XTENSA-ATOMIC-NEXT: .LBB96_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_min_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l16ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 16
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a5, .LCPI97_0
; XTENSA-NEXT: j .LBB97_2
; XTENSA-NEXT: .LBB97_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB97_4
; XTENSA-NEXT: .LBB97_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: blt a4, a8, .LBB97_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB97_1
; XTENSA-NEXT: .LBB97_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI97_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB97_2
; XTENSA-ATOMIC-NEXT: .LBB97_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB97_6
; XTENSA-ATOMIC-NEXT: .LBB97_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: blt a11, a6, .LBB97_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB97_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI97_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB97_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB97_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB97_1
; XTENSA-ATOMIC-NEXT: .LBB97_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_min_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a9, a2, a2
; XTENSA-NEXT: l16ui a2, a9, 0
; XTENSA-NEXT: s32i a3, a1, 0 # 4-byte Folded Spill
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: or a3, a9, a9
; XTENSA-NEXT: srai a4, a8, 16
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a5, .LCPI98_0
; XTENSA-NEXT: j .LBB98_2
; XTENSA-NEXT: .LBB98_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 4
; XTENSA-NEXT: or a10, a3, a3
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 4
; XTENSA-NEXT: bnez a10, .LBB98_4
; XTENSA-NEXT: .LBB98_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 4
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: l32i a12, a1, 0 # 4-byte Folded Reload
; XTENSA-NEXT: blt a4, a8, .LBB98_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB98_1
; XTENSA-NEXT: .LBB98_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI98_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB98_2
; XTENSA-ATOMIC-NEXT: .LBB98_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB98_6
; XTENSA-ATOMIC-NEXT: .LBB98_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: blt a11, a6, .LBB98_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB98_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI98_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB98_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB98_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB98_1
; XTENSA-ATOMIC-NEXT: .LBB98_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_min_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: slli a8, a3, 16
; XTENSA-NEXT: srai a5, a8, 16
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI99_0
; XTENSA-NEXT: j .LBB99_2
; XTENSA-NEXT: .LBB99_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB99_4
; XTENSA-NEXT: .LBB99_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: slli a8, a2, 16
; XTENSA-NEXT: srai a8, a8, 16
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a5, a8, .LBB99_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB99_1
; XTENSA-NEXT: .LBB99_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI99_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a14, a10, 0
; XTENSA-ATOMIC-NEXT: slli a11, a3, 16
; XTENSA-ATOMIC-NEXT: srai a11, a11, 16
; XTENSA-ATOMIC-NEXT: movi a12, 0
; XTENSA-ATOMIC-NEXT: movi a13, 1
; XTENSA-ATOMIC-NEXT: j .LBB99_2
; XTENSA-ATOMIC-NEXT: .LBB99_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a15, a15
; XTENSA-ATOMIC-NEXT: beqi a7, 1, .LBB99_6
; XTENSA-ATOMIC-NEXT: .LBB99_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a14
; XTENSA-ATOMIC-NEXT: slli a7, a15, 16
; XTENSA-ATOMIC-NEXT: srai a6, a7, 16
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: blt a11, a6, .LBB99_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB99_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-ATOMIC-NEXT: l32r a15, .LCPI99_0
; XTENSA-ATOMIC-NEXT: and a15, a7, a15
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a15, a15
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: or a15, a7, a15
; XTENSA-ATOMIC-NEXT: wsr a14, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a15, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: beq a15, a14, .LBB99_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB99_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a12, a12
; XTENSA-ATOMIC-NEXT: j .LBB99_1
; XTENSA-ATOMIC-NEXT: .LBB99_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a15
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_umax_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI100_1
; XTENSA-NEXT: j .LBB100_2
; XTENSA-NEXT: .LBB100_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB100_4
; XTENSA-NEXT: .LBB100_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI100_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a9, a8, .LBB100_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB100_1
; XTENSA-NEXT: .LBB100_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI100_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB100_2
; XTENSA-ATOMIC-NEXT: .LBB100_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB100_6
; XTENSA-ATOMIC-NEXT: .LBB100_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI100_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a6, a5, .LBB100_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB100_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB100_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB100_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB100_1
; XTENSA-ATOMIC-NEXT: .LBB100_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_umax_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI101_1
; XTENSA-NEXT: j .LBB101_2
; XTENSA-NEXT: .LBB101_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB101_4
; XTENSA-NEXT: .LBB101_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI101_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a9, a8, .LBB101_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB101_1
; XTENSA-NEXT: .LBB101_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI101_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB101_2
; XTENSA-ATOMIC-NEXT: .LBB101_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB101_6
; XTENSA-ATOMIC-NEXT: .LBB101_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI101_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a6, a5, .LBB101_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB101_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB101_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB101_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB101_1
; XTENSA-ATOMIC-NEXT: .LBB101_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_umax_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l16ui a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI102_1
; XTENSA-NEXT: j .LBB102_2
; XTENSA-NEXT: .LBB102_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB102_4
; XTENSA-NEXT: .LBB102_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI102_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a9, a8, .LBB102_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB102_1
; XTENSA-NEXT: .LBB102_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI102_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB102_2
; XTENSA-ATOMIC-NEXT: .LBB102_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB102_6
; XTENSA-ATOMIC-NEXT: .LBB102_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI102_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a6, a5, .LBB102_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB102_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB102_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB102_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB102_1
; XTENSA-ATOMIC-NEXT: .LBB102_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_umax_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l16ui a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI103_1
; XTENSA-NEXT: j .LBB103_2
; XTENSA-NEXT: .LBB103_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB103_4
; XTENSA-NEXT: .LBB103_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI103_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a9, a8, .LBB103_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB103_1
; XTENSA-NEXT: .LBB103_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI103_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB103_2
; XTENSA-ATOMIC-NEXT: .LBB103_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB103_6
; XTENSA-ATOMIC-NEXT: .LBB103_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI103_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a6, a5, .LBB103_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB103_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB103_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB103_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB103_1
; XTENSA-ATOMIC-NEXT: .LBB103_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_umax_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI104_1
; XTENSA-NEXT: j .LBB104_2
; XTENSA-NEXT: .LBB104_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB104_4
; XTENSA-NEXT: .LBB104_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI104_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a9, a8, .LBB104_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB104_1
; XTENSA-NEXT: .LBB104_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI104_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB104_2
; XTENSA-ATOMIC-NEXT: .LBB104_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB104_6
; XTENSA-ATOMIC-NEXT: .LBB104_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI104_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a6, a5, .LBB104_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB104_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB104_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB104_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB104_1
; XTENSA-ATOMIC-NEXT: .LBB104_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i16 %b seq_cst
ret i16 %res
}
define i16 @atomicrmw_umin_i16_monotonic(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i16_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI105_1
; XTENSA-NEXT: j .LBB105_2
; XTENSA-NEXT: .LBB105_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB105_4
; XTENSA-NEXT: .LBB105_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI105_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a9, a8, .LBB105_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB105_1
; XTENSA-NEXT: .LBB105_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i16_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI105_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB105_2
; XTENSA-ATOMIC-NEXT: .LBB105_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB105_6
; XTENSA-ATOMIC-NEXT: .LBB105_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI105_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a6, a5, .LBB105_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB105_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB105_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB105_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB105_1
; XTENSA-ATOMIC-NEXT: .LBB105_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i16 %b monotonic
ret i16 %res
}
define i16 @atomicrmw_umin_i16_acquire(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i16_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI106_1
; XTENSA-NEXT: j .LBB106_2
; XTENSA-NEXT: .LBB106_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB106_4
; XTENSA-NEXT: .LBB106_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI106_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a9, a8, .LBB106_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB106_1
; XTENSA-NEXT: .LBB106_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i16_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI106_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB106_2
; XTENSA-ATOMIC-NEXT: .LBB106_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB106_6
; XTENSA-ATOMIC-NEXT: .LBB106_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI106_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a6, a5, .LBB106_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB106_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB106_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB106_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB106_1
; XTENSA-ATOMIC-NEXT: .LBB106_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i16 %b acquire
ret i16 %res
}
define i16 @atomicrmw_umin_i16_release(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i16_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l16ui a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI107_1
; XTENSA-NEXT: j .LBB107_2
; XTENSA-NEXT: .LBB107_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB107_4
; XTENSA-NEXT: .LBB107_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI107_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a9, a8, .LBB107_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB107_1
; XTENSA-NEXT: .LBB107_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i16_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI107_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB107_2
; XTENSA-ATOMIC-NEXT: .LBB107_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB107_6
; XTENSA-ATOMIC-NEXT: .LBB107_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI107_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a6, a5, .LBB107_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB107_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB107_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB107_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB107_1
; XTENSA-ATOMIC-NEXT: .LBB107_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i16 %b release
ret i16 %res
}
define i16 @atomicrmw_umin_i16_acq_rel(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i16_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l16ui a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI108_1
; XTENSA-NEXT: j .LBB108_2
; XTENSA-NEXT: .LBB108_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB108_4
; XTENSA-NEXT: .LBB108_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI108_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a9, a8, .LBB108_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB108_1
; XTENSA-NEXT: .LBB108_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i16_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI108_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB108_2
; XTENSA-ATOMIC-NEXT: .LBB108_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB108_6
; XTENSA-ATOMIC-NEXT: .LBB108_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI108_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a6, a5, .LBB108_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB108_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB108_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB108_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB108_1
; XTENSA-ATOMIC-NEXT: .LBB108_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i16 %b acq_rel
ret i16 %res
}
define i16 @atomicrmw_umin_i16_seq_cst(ptr %a, i16 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i16_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l16ui a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI109_1
; XTENSA-NEXT: j .LBB109_2
; XTENSA-NEXT: .LBB109_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB109_4
; XTENSA-NEXT: .LBB109_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: l32r a8, .LCPI109_0
; XTENSA-NEXT: and a9, a3, a8
; XTENSA-NEXT: s16i a2, a1, 0
; XTENSA-NEXT: and a8, a2, a8
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a9, a8, .LBB109_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB109_1
; XTENSA-NEXT: .LBB109_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i16_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: slli a8, a2, 3
; XTENSA-ATOMIC-NEXT: movi a9, 24
; XTENSA-ATOMIC-NEXT: and a8, a8, a9
; XTENSA-ATOMIC-NEXT: l32r a9, .LCPI109_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a9, a9
; XTENSA-ATOMIC-NEXT: movi a10, -1
; XTENSA-ATOMIC-NEXT: xor a9, a9, a10
; XTENSA-ATOMIC-NEXT: movi a10, -4
; XTENSA-ATOMIC-NEXT: and a10, a2, a10
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a10, 0
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 1
; XTENSA-ATOMIC-NEXT: j .LBB109_2
; XTENSA-ATOMIC-NEXT: .LBB109_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a14, a14
; XTENSA-ATOMIC-NEXT: beqi a15, 1, .LBB109_6
; XTENSA-ATOMIC-NEXT: .LBB109_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a14, .LCPI109_0
; XTENSA-ATOMIC-NEXT: and a6, a3, a14
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a15, a13
; XTENSA-ATOMIC-NEXT: and a5, a15, a14
; XTENSA-ATOMIC-NEXT: or a7, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a6, a5, .LBB109_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a15, a15
; XTENSA-ATOMIC-NEXT: .LBB109_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-ATOMIC-NEXT: and a14, a7, a14
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a14, a14
; XTENSA-ATOMIC-NEXT: and a15, a13, a9
; XTENSA-ATOMIC-NEXT: or a14, a15, a14
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a15, a12, a12
; XTENSA-ATOMIC-NEXT: beq a14, a13, .LBB109_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB109_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB109_1
; XTENSA-ATOMIC-NEXT: .LBB109_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i16 %b seq_cst
ret i16 %res
}
define i32 @atomicrmw_xchg_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI110_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB110_2
; XTENSA-ATOMIC-NEXT: .LBB110_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB110_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB110_4
; XTENSA-ATOMIC-NEXT: .LBB110_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB110_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB110_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB110_1
; XTENSA-ATOMIC-NEXT: .LBB110_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_xchg_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI111_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB111_2
; XTENSA-ATOMIC-NEXT: .LBB111_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB111_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB111_4
; XTENSA-ATOMIC-NEXT: .LBB111_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB111_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB111_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB111_1
; XTENSA-ATOMIC-NEXT: .LBB111_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_xchg_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI112_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB112_2
; XTENSA-ATOMIC-NEXT: .LBB112_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB112_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB112_4
; XTENSA-ATOMIC-NEXT: .LBB112_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB112_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB112_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB112_1
; XTENSA-ATOMIC-NEXT: .LBB112_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_xchg_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI113_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB113_2
; XTENSA-ATOMIC-NEXT: .LBB113_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB113_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB113_4
; XTENSA-ATOMIC-NEXT: .LBB113_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB113_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB113_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB113_1
; XTENSA-ATOMIC-NEXT: .LBB113_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_xchg_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xchg_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI114_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xchg_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB114_2
; XTENSA-ATOMIC-NEXT: .LBB114_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB114_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB114_4
; XTENSA-ATOMIC-NEXT: .LBB114_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB114_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB114_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB114_1
; XTENSA-ATOMIC-NEXT: .LBB114_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xchg ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_add_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI115_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB115_2
; XTENSA-ATOMIC-NEXT: .LBB115_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB115_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB115_4
; XTENSA-ATOMIC-NEXT: .LBB115_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: add a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB115_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB115_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB115_1
; XTENSA-ATOMIC-NEXT: .LBB115_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_add_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI116_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB116_2
; XTENSA-ATOMIC-NEXT: .LBB116_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB116_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB116_4
; XTENSA-ATOMIC-NEXT: .LBB116_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: add a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB116_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB116_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB116_1
; XTENSA-ATOMIC-NEXT: .LBB116_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_add_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI117_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB117_2
; XTENSA-ATOMIC-NEXT: .LBB117_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB117_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB117_4
; XTENSA-ATOMIC-NEXT: .LBB117_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: add a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB117_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB117_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB117_1
; XTENSA-ATOMIC-NEXT: .LBB117_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_add_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI118_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB118_2
; XTENSA-ATOMIC-NEXT: .LBB118_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB118_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB118_4
; XTENSA-ATOMIC-NEXT: .LBB118_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: add a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB118_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB118_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB118_1
; XTENSA-ATOMIC-NEXT: .LBB118_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_add_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_add_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI119_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_add_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB119_2
; XTENSA-ATOMIC-NEXT: .LBB119_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB119_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB119_4
; XTENSA-ATOMIC-NEXT: .LBB119_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: add a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB119_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB119_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB119_1
; XTENSA-ATOMIC-NEXT: .LBB119_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw add ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_sub_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI120_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB120_2
; XTENSA-ATOMIC-NEXT: .LBB120_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB120_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB120_4
; XTENSA-ATOMIC-NEXT: .LBB120_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: sub a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB120_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB120_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB120_1
; XTENSA-ATOMIC-NEXT: .LBB120_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_sub_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI121_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB121_2
; XTENSA-ATOMIC-NEXT: .LBB121_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB121_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB121_4
; XTENSA-ATOMIC-NEXT: .LBB121_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: sub a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB121_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB121_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB121_1
; XTENSA-ATOMIC-NEXT: .LBB121_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_sub_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI122_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB122_2
; XTENSA-ATOMIC-NEXT: .LBB122_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB122_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB122_4
; XTENSA-ATOMIC-NEXT: .LBB122_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: sub a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB122_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB122_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB122_1
; XTENSA-ATOMIC-NEXT: .LBB122_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_sub_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI123_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB123_2
; XTENSA-ATOMIC-NEXT: .LBB123_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB123_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB123_4
; XTENSA-ATOMIC-NEXT: .LBB123_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: sub a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB123_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB123_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB123_1
; XTENSA-ATOMIC-NEXT: .LBB123_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_sub_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_sub_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI124_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_sub_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB124_2
; XTENSA-ATOMIC-NEXT: .LBB124_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB124_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB124_4
; XTENSA-ATOMIC-NEXT: .LBB124_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: sub a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB124_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB124_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB124_1
; XTENSA-ATOMIC-NEXT: .LBB124_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw sub ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_and_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI125_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB125_2
; XTENSA-ATOMIC-NEXT: .LBB125_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB125_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB125_4
; XTENSA-ATOMIC-NEXT: .LBB125_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB125_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB125_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB125_1
; XTENSA-ATOMIC-NEXT: .LBB125_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_and_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI126_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB126_2
; XTENSA-ATOMIC-NEXT: .LBB126_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB126_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB126_4
; XTENSA-ATOMIC-NEXT: .LBB126_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB126_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB126_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB126_1
; XTENSA-ATOMIC-NEXT: .LBB126_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_and_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI127_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB127_2
; XTENSA-ATOMIC-NEXT: .LBB127_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB127_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB127_4
; XTENSA-ATOMIC-NEXT: .LBB127_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB127_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB127_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB127_1
; XTENSA-ATOMIC-NEXT: .LBB127_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_and_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI128_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB128_2
; XTENSA-ATOMIC-NEXT: .LBB128_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB128_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB128_4
; XTENSA-ATOMIC-NEXT: .LBB128_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB128_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB128_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB128_1
; XTENSA-ATOMIC-NEXT: .LBB128_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_and_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_and_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI129_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_and_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB129_2
; XTENSA-ATOMIC-NEXT: .LBB129_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB129_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB129_4
; XTENSA-ATOMIC-NEXT: .LBB129_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB129_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB129_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB129_1
; XTENSA-ATOMIC-NEXT: .LBB129_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw and ptr %a, i32 %b seq_cst
ret i32 %res
}
;define i32 @atomicrmw_nand_i32_monotonic(ptr %a, i32 %b) nounwind {
; %res = atomicrmw nand ptr %a, i32 %b monotonic
; ret i32 %res
;}
;
;define i32 @atomicrmw_nand_i32_acquire(ptr %a, i32 %b) nounwind {
; %res = atomicrmw nand ptr %a, i32 %b acquire
; ret i32 %res
;}
;
;define i32 @atomicrmw_nand_i32_release(ptr %a, i32 %b) nounwind {
; %res = atomicrmw nand ptr %a, i32 %b release
; ret i32 %res
;}
;
;define i32 @atomicrmw_nand_i32_acq_rel(ptr %a, i32 %b) nounwind {
; %res = atomicrmw nand ptr %a, i32 %b acq_rel
; ret i32 %res
;}
;
;define i32 @atomicrmw_nand_i32_seq_cst(ptr %a, i32 %b) nounwind {
; %res = atomicrmw nand ptr %a, i32 %b seq_cst
; ret i32 %res
;}
define i32 @atomicrmw_or_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI130_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB130_2
; XTENSA-ATOMIC-NEXT: .LBB130_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB130_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB130_4
; XTENSA-ATOMIC-NEXT: .LBB130_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB130_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB130_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB130_1
; XTENSA-ATOMIC-NEXT: .LBB130_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_or_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI131_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB131_2
; XTENSA-ATOMIC-NEXT: .LBB131_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB131_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB131_4
; XTENSA-ATOMIC-NEXT: .LBB131_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB131_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB131_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB131_1
; XTENSA-ATOMIC-NEXT: .LBB131_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_or_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI132_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB132_2
; XTENSA-ATOMIC-NEXT: .LBB132_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB132_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB132_4
; XTENSA-ATOMIC-NEXT: .LBB132_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB132_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB132_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB132_1
; XTENSA-ATOMIC-NEXT: .LBB132_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_or_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI133_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB133_2
; XTENSA-ATOMIC-NEXT: .LBB133_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB133_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB133_4
; XTENSA-ATOMIC-NEXT: .LBB133_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB133_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB133_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB133_1
; XTENSA-ATOMIC-NEXT: .LBB133_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_or_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_or_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI134_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_or_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB134_2
; XTENSA-ATOMIC-NEXT: .LBB134_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB134_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB134_4
; XTENSA-ATOMIC-NEXT: .LBB134_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB134_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB134_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB134_1
; XTENSA-ATOMIC-NEXT: .LBB134_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw or ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_xor_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI135_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB135_2
; XTENSA-ATOMIC-NEXT: .LBB135_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB135_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB135_4
; XTENSA-ATOMIC-NEXT: .LBB135_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB135_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB135_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB135_1
; XTENSA-ATOMIC-NEXT: .LBB135_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_xor_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 2
; XTENSA-NEXT: l32r a8, .LCPI136_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB136_2
; XTENSA-ATOMIC-NEXT: .LBB136_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB136_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB136_4
; XTENSA-ATOMIC-NEXT: .LBB136_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB136_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB136_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB136_1
; XTENSA-ATOMIC-NEXT: .LBB136_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_xor_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI137_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB137_2
; XTENSA-ATOMIC-NEXT: .LBB137_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB137_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB137_4
; XTENSA-ATOMIC-NEXT: .LBB137_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB137_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB137_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB137_1
; XTENSA-ATOMIC-NEXT: .LBB137_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_xor_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 4
; XTENSA-NEXT: l32r a8, .LCPI138_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB138_2
; XTENSA-ATOMIC-NEXT: .LBB138_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB138_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB138_4
; XTENSA-ATOMIC-NEXT: .LBB138_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB138_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB138_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB138_1
; XTENSA-ATOMIC-NEXT: .LBB138_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_xor_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_xor_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a11, a3, a3
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI139_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_xor_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB139_2
; XTENSA-ATOMIC-NEXT: .LBB139_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB139_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB139_4
; XTENSA-ATOMIC-NEXT: .LBB139_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a3
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB139_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB139_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB139_1
; XTENSA-ATOMIC-NEXT: .LBB139_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw xor ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_max_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI140_0
; XTENSA-NEXT: j .LBB140_2
; XTENSA-NEXT: .LBB140_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB140_4
; XTENSA-NEXT: .LBB140_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a3, a2, .LBB140_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB140_1
; XTENSA-NEXT: .LBB140_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB140_2
; XTENSA-ATOMIC-NEXT: .LBB140_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB140_6
; XTENSA-ATOMIC-NEXT: .LBB140_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bge a3, a11, .LBB140_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB140_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB140_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB140_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB140_1
; XTENSA-ATOMIC-NEXT: .LBB140_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_max_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI141_0
; XTENSA-NEXT: j .LBB141_2
; XTENSA-NEXT: .LBB141_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB141_4
; XTENSA-NEXT: .LBB141_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a3, a2, .LBB141_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB141_1
; XTENSA-NEXT: .LBB141_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB141_2
; XTENSA-ATOMIC-NEXT: .LBB141_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB141_6
; XTENSA-ATOMIC-NEXT: .LBB141_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bge a3, a11, .LBB141_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB141_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB141_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB141_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB141_1
; XTENSA-ATOMIC-NEXT: .LBB141_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_max_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI142_0
; XTENSA-NEXT: j .LBB142_2
; XTENSA-NEXT: .LBB142_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB142_4
; XTENSA-NEXT: .LBB142_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a3, a2, .LBB142_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB142_1
; XTENSA-NEXT: .LBB142_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB142_2
; XTENSA-ATOMIC-NEXT: .LBB142_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB142_6
; XTENSA-ATOMIC-NEXT: .LBB142_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bge a3, a11, .LBB142_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB142_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB142_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB142_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB142_1
; XTENSA-ATOMIC-NEXT: .LBB142_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_max_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI143_0
; XTENSA-NEXT: j .LBB143_2
; XTENSA-NEXT: .LBB143_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB143_4
; XTENSA-NEXT: .LBB143_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a3, a2, .LBB143_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB143_1
; XTENSA-NEXT: .LBB143_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB143_2
; XTENSA-ATOMIC-NEXT: .LBB143_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB143_6
; XTENSA-ATOMIC-NEXT: .LBB143_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bge a3, a11, .LBB143_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB143_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB143_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB143_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB143_1
; XTENSA-ATOMIC-NEXT: .LBB143_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_max_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_max_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI144_0
; XTENSA-NEXT: j .LBB144_2
; XTENSA-NEXT: .LBB144_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB144_4
; XTENSA-NEXT: .LBB144_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bge a3, a2, .LBB144_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB144_1
; XTENSA-NEXT: .LBB144_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_max_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB144_2
; XTENSA-ATOMIC-NEXT: .LBB144_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB144_6
; XTENSA-ATOMIC-NEXT: .LBB144_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bge a3, a11, .LBB144_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB144_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB144_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB144_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB144_1
; XTENSA-ATOMIC-NEXT: .LBB144_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw max ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_min_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI145_0
; XTENSA-NEXT: j .LBB145_2
; XTENSA-NEXT: .LBB145_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB145_4
; XTENSA-NEXT: .LBB145_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a3, a2, .LBB145_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB145_1
; XTENSA-NEXT: .LBB145_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB145_2
; XTENSA-ATOMIC-NEXT: .LBB145_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB145_6
; XTENSA-ATOMIC-NEXT: .LBB145_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: blt a3, a11, .LBB145_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB145_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB145_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB145_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB145_1
; XTENSA-ATOMIC-NEXT: .LBB145_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_min_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI146_0
; XTENSA-NEXT: j .LBB146_2
; XTENSA-NEXT: .LBB146_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB146_4
; XTENSA-NEXT: .LBB146_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a3, a2, .LBB146_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB146_1
; XTENSA-NEXT: .LBB146_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB146_2
; XTENSA-ATOMIC-NEXT: .LBB146_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB146_6
; XTENSA-ATOMIC-NEXT: .LBB146_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: blt a3, a11, .LBB146_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB146_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB146_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB146_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB146_1
; XTENSA-ATOMIC-NEXT: .LBB146_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_min_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI147_0
; XTENSA-NEXT: j .LBB147_2
; XTENSA-NEXT: .LBB147_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB147_4
; XTENSA-NEXT: .LBB147_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a3, a2, .LBB147_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB147_1
; XTENSA-NEXT: .LBB147_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB147_2
; XTENSA-ATOMIC-NEXT: .LBB147_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB147_6
; XTENSA-ATOMIC-NEXT: .LBB147_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: blt a3, a11, .LBB147_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB147_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB147_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB147_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB147_1
; XTENSA-ATOMIC-NEXT: .LBB147_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_min_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI148_0
; XTENSA-NEXT: j .LBB148_2
; XTENSA-NEXT: .LBB148_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB148_4
; XTENSA-NEXT: .LBB148_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a3, a2, .LBB148_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB148_1
; XTENSA-NEXT: .LBB148_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB148_2
; XTENSA-ATOMIC-NEXT: .LBB148_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB148_6
; XTENSA-ATOMIC-NEXT: .LBB148_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: blt a3, a11, .LBB148_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB148_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB148_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB148_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB148_1
; XTENSA-ATOMIC-NEXT: .LBB148_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_min_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_min_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI149_0
; XTENSA-NEXT: j .LBB149_2
; XTENSA-NEXT: .LBB149_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB149_4
; XTENSA-NEXT: .LBB149_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: blt a3, a2, .LBB149_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB149_1
; XTENSA-NEXT: .LBB149_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_min_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB149_2
; XTENSA-ATOMIC-NEXT: .LBB149_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB149_6
; XTENSA-ATOMIC-NEXT: .LBB149_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: blt a3, a11, .LBB149_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB149_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB149_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB149_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB149_1
; XTENSA-ATOMIC-NEXT: .LBB149_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw min ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_umax_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI150_0
; XTENSA-NEXT: j .LBB150_2
; XTENSA-NEXT: .LBB150_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB150_4
; XTENSA-NEXT: .LBB150_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a3, a2, .LBB150_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB150_1
; XTENSA-NEXT: .LBB150_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB150_2
; XTENSA-ATOMIC-NEXT: .LBB150_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB150_6
; XTENSA-ATOMIC-NEXT: .LBB150_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a3, a11, .LBB150_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB150_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB150_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB150_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB150_1
; XTENSA-ATOMIC-NEXT: .LBB150_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_umax_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI151_0
; XTENSA-NEXT: j .LBB151_2
; XTENSA-NEXT: .LBB151_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB151_4
; XTENSA-NEXT: .LBB151_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a3, a2, .LBB151_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB151_1
; XTENSA-NEXT: .LBB151_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB151_2
; XTENSA-ATOMIC-NEXT: .LBB151_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB151_6
; XTENSA-ATOMIC-NEXT: .LBB151_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a3, a11, .LBB151_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB151_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB151_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB151_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB151_1
; XTENSA-ATOMIC-NEXT: .LBB151_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_umax_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI152_0
; XTENSA-NEXT: j .LBB152_2
; XTENSA-NEXT: .LBB152_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB152_4
; XTENSA-NEXT: .LBB152_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a3, a2, .LBB152_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB152_1
; XTENSA-NEXT: .LBB152_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB152_2
; XTENSA-ATOMIC-NEXT: .LBB152_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB152_6
; XTENSA-ATOMIC-NEXT: .LBB152_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a3, a11, .LBB152_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB152_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB152_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB152_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB152_1
; XTENSA-ATOMIC-NEXT: .LBB152_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_umax_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI153_0
; XTENSA-NEXT: j .LBB153_2
; XTENSA-NEXT: .LBB153_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB153_4
; XTENSA-NEXT: .LBB153_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a3, a2, .LBB153_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB153_1
; XTENSA-NEXT: .LBB153_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB153_2
; XTENSA-ATOMIC-NEXT: .LBB153_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB153_6
; XTENSA-ATOMIC-NEXT: .LBB153_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a3, a11, .LBB153_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB153_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB153_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB153_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB153_1
; XTENSA-ATOMIC-NEXT: .LBB153_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_umax_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umax_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI154_0
; XTENSA-NEXT: j .LBB154_2
; XTENSA-NEXT: .LBB154_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB154_4
; XTENSA-NEXT: .LBB154_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bgeu a3, a2, .LBB154_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB154_1
; XTENSA-NEXT: .LBB154_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umax_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB154_2
; XTENSA-ATOMIC-NEXT: .LBB154_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB154_6
; XTENSA-ATOMIC-NEXT: .LBB154_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bgeu a3, a11, .LBB154_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB154_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB154_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB154_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB154_1
; XTENSA-ATOMIC-NEXT: .LBB154_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umax ptr %a, i32 %b seq_cst
ret i32 %res
}
define i32 @atomicrmw_umin_i32_monotonic(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 0
; XTENSA-NEXT: l32r a5, .LCPI155_0
; XTENSA-NEXT: j .LBB155_2
; XTENSA-NEXT: .LBB155_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB155_4
; XTENSA-NEXT: .LBB155_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a3, a2, .LBB155_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB155_1
; XTENSA-NEXT: .LBB155_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB155_2
; XTENSA-ATOMIC-NEXT: .LBB155_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB155_6
; XTENSA-ATOMIC-NEXT: .LBB155_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a3, a11, .LBB155_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB155_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB155_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB155_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB155_1
; XTENSA-ATOMIC-NEXT: .LBB155_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i32 %b monotonic
ret i32 %res
}
define i32 @atomicrmw_umin_i32_acquire(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 2
; XTENSA-NEXT: l32r a5, .LCPI156_0
; XTENSA-NEXT: j .LBB156_2
; XTENSA-NEXT: .LBB156_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB156_4
; XTENSA-NEXT: .LBB156_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a3, a2, .LBB156_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB156_1
; XTENSA-NEXT: .LBB156_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB156_2
; XTENSA-ATOMIC-NEXT: .LBB156_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB156_6
; XTENSA-ATOMIC-NEXT: .LBB156_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a3, a11, .LBB156_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB156_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB156_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB156_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB156_1
; XTENSA-ATOMIC-NEXT: .LBB156_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i32 %b acquire
ret i32 %res
}
define i32 @atomicrmw_umin_i32_release(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 3
; XTENSA-NEXT: movi a6, 0
; XTENSA-NEXT: l32r a4, .LCPI157_0
; XTENSA-NEXT: j .LBB157_2
; XTENSA-NEXT: .LBB157_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB157_4
; XTENSA-NEXT: .LBB157_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a3, a2, .LBB157_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB157_1
; XTENSA-NEXT: .LBB157_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB157_2
; XTENSA-ATOMIC-NEXT: .LBB157_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB157_6
; XTENSA-ATOMIC-NEXT: .LBB157_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a3, a11, .LBB157_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB157_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB157_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB157_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB157_1
; XTENSA-ATOMIC-NEXT: .LBB157_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i32 %b release
ret i32 %res
}
define i32 @atomicrmw_umin_i32_acq_rel(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i32_acq_rel:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a5, a2, a2
; XTENSA-NEXT: l32i a2, a5, 0
; XTENSA-NEXT: movi a7, 4
; XTENSA-NEXT: movi a6, 2
; XTENSA-NEXT: l32r a4, .LCPI158_0
; XTENSA-NEXT: j .LBB158_2
; XTENSA-NEXT: .LBB158_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a5, a5
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a6, a6
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB158_4
; XTENSA-NEXT: .LBB158_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a3, a2, .LBB158_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB158_1
; XTENSA-NEXT: .LBB158_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i32_acq_rel:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB158_2
; XTENSA-ATOMIC-NEXT: .LBB158_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB158_6
; XTENSA-ATOMIC-NEXT: .LBB158_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a3, a11, .LBB158_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB158_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB158_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB158_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB158_1
; XTENSA-ATOMIC-NEXT: .LBB158_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i32 %b acq_rel
ret i32 %res
}
define i32 @atomicrmw_umin_i32_seq_cst(ptr %a, i32 %b) nounwind {
; XTENSA-LABEL: atomicrmw_umin_i32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a6, a2, a2
; XTENSA-NEXT: l32i a2, a6, 0
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI159_0
; XTENSA-NEXT: j .LBB159_2
; XTENSA-NEXT: .LBB159_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a6, a6
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB159_4
; XTENSA-NEXT: .LBB159_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a3, a3
; XTENSA-NEXT: bltu a3, a2, .LBB159_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB159_1
; XTENSA-NEXT: .LBB159_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: atomicrmw_umin_i32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a11, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: movi a10, 1
; XTENSA-ATOMIC-NEXT: j .LBB159_2
; XTENSA-ATOMIC-NEXT: .LBB159_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB159_6
; XTENSA-ATOMIC-NEXT: .LBB159_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a3, a3
; XTENSA-ATOMIC-NEXT: bltu a3, a11, .LBB159_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB159_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB159_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB159_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB159_1
; XTENSA-ATOMIC-NEXT: .LBB159_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = atomicrmw umin ptr %a, i32 %b seq_cst
ret i32 %res
}