blob: eeec87b7ab132f9d8b6fb6bbf5a75d5f9e0e8f02 [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 -mattr=+forced-atomics < %s | FileCheck %s --check-prefixes=XTENSA-ATOMIC
define i8 @load8(ptr %p) nounwind {
; XTENSA-LABEL: load8:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 5
; XTENSA-NEXT: l32r a8, .LCPI0_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load8:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l8ui a2, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i8, ptr %p seq_cst, align 1
ret i8 %v
}
define void @store8(ptr %p) nounwind {
; XTENSA-LABEL: store8:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI1_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store8:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s8i a8, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
store atomic i8 0, ptr %p seq_cst, align 1
ret void
}
define i8 @rmw8(ptr %p) nounwind {
; XTENSA-LABEL: rmw8:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI2_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw8:
; 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, 1
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: movi a11, 255
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a11, a11
; XTENSA-ATOMIC-NEXT: movi a12, -1
; XTENSA-ATOMIC-NEXT: xor a12, a11, a12
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; 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, a7, a7
; XTENSA-ATOMIC-NEXT: beqi a6, 1, .LBB2_4
; XTENSA-ATOMIC-NEXT: .LBB2_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a15, a12
; XTENSA-ATOMIC-NEXT: add a6, a15, a10
; XTENSA-ATOMIC-NEXT: and a6, a6, a11
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a13, 0
; XTENSA-ATOMIC-NEXT: or a6, a9, a9
; XTENSA-ATOMIC-NEXT: beq a7, a15, .LBB2_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB2_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a6, a14, a14
; XTENSA-ATOMIC-NEXT: j .LBB2_1
; XTENSA-ATOMIC-NEXT: .LBB2_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a7
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw add ptr %p, i8 1 seq_cst, align 1
ret i8 %v
}
define i8 @cmpxchg8(ptr %p) nounwind {
; XTENSA-LABEL: cmpxchg8:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a8, 0
; XTENSA-NEXT: s8i a8, a1, 0
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: movi a12, 1
; XTENSA-NEXT: movi a13, 5
; XTENSA-NEXT: l32r a8, .LCPI3_0
; XTENSA-NEXT: or a14, a13, a13
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: l8ui a2, a1, 0
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: cmpxchg8:
; 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 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 a11, a10, 0
; XTENSA-ATOMIC-NEXT: and a7, a11, a9
; XTENSA-ATOMIC-NEXT: movi a11, 1
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a12, a11
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: .LBB3_1: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: or a14, a15, a12
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a11, a11
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB3_3
; XTENSA-ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB3_1 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: .LBB3_3: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB3_1 Depth=1
; XTENSA-ATOMIC-NEXT: bnez a7, .LBB3_5
; XTENSA-ATOMIC-NEXT: # %bb.4: # %partword.cmpxchg.failure
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB3_1 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: bne a15, a7, .LBB3_1
; XTENSA-ATOMIC-NEXT: .LBB3_5: # %partword.cmpxchg.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = cmpxchg ptr %p, i8 0, i8 1 seq_cst seq_cst
%res.0 = extractvalue { i8, i1 } %res, 0
ret i8 %res.0
}
define i16 @load16(ptr %p) nounwind {
; XTENSA-LABEL: load16:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 5
; XTENSA-NEXT: l32r a8, .LCPI4_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load16:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l16ui a2, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i16, ptr %p seq_cst, align 2
ret i16 %v
}
define void @store16(ptr %p) nounwind {
; XTENSA-LABEL: store16:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI5_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store16:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s16i a8, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
store atomic i16 0, ptr %p seq_cst, align 2
ret void
}
define i16 @rmw16(ptr %p) nounwind {
; XTENSA-LABEL: rmw16:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI6_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw16:
; 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, 1
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a10, a9
; XTENSA-ATOMIC-NEXT: l32r a11, .LCPI6_0
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a11, a11
; XTENSA-ATOMIC-NEXT: movi a12, -1
; XTENSA-ATOMIC-NEXT: xor a12, a11, a12
; XTENSA-ATOMIC-NEXT: movi a13, -4
; XTENSA-ATOMIC-NEXT: and a13, a2, a13
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a15, a13, 0
; XTENSA-ATOMIC-NEXT: movi a14, 0
; 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, a12
; XTENSA-ATOMIC-NEXT: add a6, a15, a10
; XTENSA-ATOMIC-NEXT: and a6, a6, a11
; XTENSA-ATOMIC-NEXT: or a7, a7, a6
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a7, a13, 0
; XTENSA-ATOMIC-NEXT: or a6, a9, a9
; 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, a14, a14
; 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
%v = atomicrmw add ptr %p, i16 1 seq_cst, align 2
ret i16 %v
}
define i16 @cmpxchg16(ptr %p) nounwind {
; XTENSA-LABEL: cmpxchg16:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a8, 0
; XTENSA-NEXT: s16i a8, a1, 0
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: movi a12, 1
; XTENSA-NEXT: movi a13, 5
; XTENSA-NEXT: l32r a8, .LCPI7_0
; XTENSA-NEXT: or a14, a13, a13
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: l16ui a2, a1, 0
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: cmpxchg16:
; 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, .LCPI7_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 a11, a10, 0
; XTENSA-ATOMIC-NEXT: and a7, a11, a9
; XTENSA-ATOMIC-NEXT: movi a11, 1
; XTENSA-ATOMIC-NEXT: ssl a8
; XTENSA-ATOMIC-NEXT: sll a12, a11
; XTENSA-ATOMIC-NEXT: movi a13, 0
; XTENSA-ATOMIC-NEXT: .LBB7_1: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a15, a7, a7
; XTENSA-ATOMIC-NEXT: or a14, a15, a12
; XTENSA-ATOMIC-NEXT: wsr a15, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a14, a10, 0
; XTENSA-ATOMIC-NEXT: or a7, a11, a11
; XTENSA-ATOMIC-NEXT: beq a14, a15, .LBB7_3
; XTENSA-ATOMIC-NEXT: # %bb.2: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB7_1 Depth=1
; XTENSA-ATOMIC-NEXT: or a7, a13, a13
; XTENSA-ATOMIC-NEXT: .LBB7_3: # %partword.cmpxchg.loop
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB7_1 Depth=1
; XTENSA-ATOMIC-NEXT: bnez a7, .LBB7_5
; XTENSA-ATOMIC-NEXT: # %bb.4: # %partword.cmpxchg.failure
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB7_1 Depth=1
; XTENSA-ATOMIC-NEXT: and a7, a14, a9
; XTENSA-ATOMIC-NEXT: bne a15, a7, .LBB7_1
; XTENSA-ATOMIC-NEXT: .LBB7_5: # %partword.cmpxchg.end
; XTENSA-ATOMIC-NEXT: ssr a8
; XTENSA-ATOMIC-NEXT: srl a2, a14
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%res = cmpxchg ptr %p, i16 0, i16 1 seq_cst seq_cst
%res.0 = extractvalue { i16, i1 } %res, 0
ret i16 %res.0
}
define i32 @load32_unordered(ptr %p) nounwind {
; XTENSA-LABEL: load32_unordered:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: l32r a8, .LCPI8_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load32_unordered:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a2, a2, 0
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i32, ptr %p unordered, align 4
ret i32 %v
}
define i32 @load32_monotonic(ptr %p) nounwind {
; XTENSA-LABEL: load32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: l32r a8, .LCPI9_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a2, a2, 0
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i32, ptr %p monotonic, align 4
ret i32 %v
}
define i32 @load32_acquire(ptr %p) nounwind {
; XTENSA-LABEL: load32_acquire:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 2
; XTENSA-NEXT: l32r a8, .LCPI10_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load32_acquire:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a2, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i32, ptr %p acquire, align 4
ret i32 %v
}
define i32 @load32_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: load32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 5
; XTENSA-NEXT: l32r a8, .LCPI11_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: load32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: l32i a2, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
%v = load atomic i32, ptr %p seq_cst, align 4
ret i32 %v
}
define void @store32_unordered(ptr %p) nounwind {
; XTENSA-LABEL: store32_unordered:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: l32r a8, .LCPI12_0
; XTENSA-NEXT: or a12, a11, a11
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store32_unordered:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s32i a8, a2, 0
; XTENSA-ATOMIC-NEXT: retw
store atomic i32 0, ptr %p unordered, align 4
ret void
}
define void @store32_monotonic(ptr %p) nounwind {
; XTENSA-LABEL: store32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: l32r a8, .LCPI13_0
; XTENSA-NEXT: or a12, a11, a11
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s32i a8, a2, 0
; XTENSA-ATOMIC-NEXT: retw
store atomic i32 0, ptr %p monotonic, align 4
ret void
}
define void @store32_release(ptr %p) nounwind {
; XTENSA-LABEL: store32_release:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: movi a12, 3
; XTENSA-NEXT: l32r a8, .LCPI14_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store32_release:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s32i a8, a2, 0
; XTENSA-ATOMIC-NEXT: retw
store atomic i32 0, ptr %p release, align 4
ret void
}
define void @store32_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: store32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 0
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI15_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: store32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: movi a8, 0
; XTENSA-ATOMIC-NEXT: s32i a8, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: retw
store atomic i32 0, ptr %p seq_cst, align 4
ret void
}
define i32 @rmw32_add_monotonic(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_add_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 0
; XTENSA-NEXT: l32r a8, .LCPI16_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_add_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 .LBB16_2
; XTENSA-ATOMIC-NEXT: .LBB16_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB16_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB16_4
; XTENSA-ATOMIC-NEXT: .LBB16_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: addi a8, a11, 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, .LBB16_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB16_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB16_1
; XTENSA-ATOMIC-NEXT: .LBB16_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw add ptr %p, i32 1 monotonic, align 4
ret i32 %v
}
define i32 @rmw32_add_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_add_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI17_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_add_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 .LBB17_2
; XTENSA-ATOMIC-NEXT: .LBB17_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB17_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB17_4
; XTENSA-ATOMIC-NEXT: .LBB17_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: addi a8, a11, 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, .LBB17_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB17_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB17_1
; XTENSA-ATOMIC-NEXT: .LBB17_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw add ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_sub_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_sub_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI18_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_sub_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 .LBB18_2
; XTENSA-ATOMIC-NEXT: .LBB18_1: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB18_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB18_4
; XTENSA-ATOMIC-NEXT: .LBB18_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: addi a8, a11, -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, .LBB18_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB18_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: j .LBB18_1
; XTENSA-ATOMIC-NEXT: .LBB18_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw sub ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_and_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_and_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; 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: rmw32_and_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB19_4
; XTENSA-ATOMIC-NEXT: .LBB19_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: and a8, a11, a9
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB19_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB19_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB19_1
; XTENSA-ATOMIC-NEXT: .LBB19_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw and ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_nand_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_nand_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI20_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_nand_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a13, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, -1
; XTENSA-ATOMIC-NEXT: movi a10, -2
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: movi a12, 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 a13, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a14, 1, .LBB20_4
; XTENSA-ATOMIC-NEXT: .LBB20_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a13, a9
; XTENSA-ATOMIC-NEXT: or a8, a8, a10
; XTENSA-ATOMIC-NEXT: wsr a13, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a14, a12, a12
; XTENSA-ATOMIC-NEXT: beq a8, a13, .LBB20_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB20_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a14, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB20_1
; XTENSA-ATOMIC-NEXT: .LBB20_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw nand ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_or_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_or_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI21_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_or_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB21_4
; XTENSA-ATOMIC-NEXT: .LBB21_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a9
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB21_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB21_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB21_1
; XTENSA-ATOMIC-NEXT: .LBB21_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw or ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_xor_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_xor_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI22_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_xor_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB22_4
; XTENSA-ATOMIC-NEXT: .LBB22_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: xor a8, a11, a9
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB22_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB22_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB22_1
; XTENSA-ATOMIC-NEXT: .LBB22_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw xor ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_max_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_max_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 a5, 1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI23_0
; XTENSA-NEXT: j .LBB23_2
; XTENSA-NEXT: .LBB23_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB23_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: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB23_4
; XTENSA-NEXT: .LBB23_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: bge a5, a2, .LBB23_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB23_1
; XTENSA-NEXT: .LBB23_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_max_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB23_6
; XTENSA-ATOMIC-NEXT: .LBB23_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a9, a9
; XTENSA-ATOMIC-NEXT: bge a9, a11, .LBB23_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB23_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB23_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB23_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB23_1
; XTENSA-ATOMIC-NEXT: .LBB23_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw max ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_min_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_min_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a12, a2, 0
; XTENSA-NEXT: movi a6, 1
; XTENSA-NEXT: movi a5, 2
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI24_0
; XTENSA-NEXT: j .LBB24_2
; XTENSA-NEXT: .LBB24_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a12, a1, 0
; XTENSA-NEXT: bnez a10, .LBB24_4
; XTENSA-NEXT: .LBB24_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a12, a1, 0
; XTENSA-NEXT: blt a12, a5, .LBB24_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-NEXT: or a12, a6, a6
; XTENSA-NEXT: j .LBB24_1
; XTENSA-NEXT: .LBB24_4: # %atomicrmw.end
; XTENSA-NEXT: or a2, a12, a12
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_min_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a12, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 1
; XTENSA-ATOMIC-NEXT: movi a10, 2
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: or a8, a12, a12
; 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 a12, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a13, 1, .LBB24_6
; XTENSA-ATOMIC-NEXT: .LBB24_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: blt a12, a10, .LBB24_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a9, a9
; XTENSA-ATOMIC-NEXT: .LBB24_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a12, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a13, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a12, .LBB24_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB24_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB24_1
; XTENSA-ATOMIC-NEXT: .LBB24_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw min ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_umax_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_umax_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 a5, 1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI25_0
; XTENSA-NEXT: j .LBB25_2
; XTENSA-NEXT: .LBB25_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB25_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: l32i a2, a1, 0
; XTENSA-NEXT: bnez a10, .LBB25_4
; XTENSA-NEXT: .LBB25_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a2, a1, 0
; XTENSA-NEXT: or a12, a5, a5
; XTENSA-NEXT: bgeu a5, a2, .LBB25_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-NEXT: or a12, a2, a2
; XTENSA-NEXT: j .LBB25_1
; XTENSA-NEXT: .LBB25_4: # %atomicrmw.end
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_umax_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB25_6
; XTENSA-ATOMIC-NEXT: .LBB25_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a9, a9
; XTENSA-ATOMIC-NEXT: bgeu a9, a11, .LBB25_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a11, a11
; XTENSA-ATOMIC-NEXT: .LBB25_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB25_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB25_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB25_1
; XTENSA-ATOMIC-NEXT: .LBB25_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw umax ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_umin_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_umin_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a12, a2, 0
; XTENSA-NEXT: movi a6, 1
; XTENSA-NEXT: movi a5, 2
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a4, .LCPI26_0
; XTENSA-NEXT: j .LBB26_2
; XTENSA-NEXT: .LBB26_1: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a4
; XTENSA-NEXT: l32i a12, a1, 0
; XTENSA-NEXT: bnez a10, .LBB26_4
; XTENSA-NEXT: .LBB26_2: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a12, a1, 0
; XTENSA-NEXT: bltu a12, a5, .LBB26_1
; XTENSA-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-NEXT: or a12, a6, a6
; XTENSA-NEXT: j .LBB26_1
; XTENSA-NEXT: .LBB26_4: # %atomicrmw.end
; XTENSA-NEXT: or a2, a12, a12
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_umin_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a12, a2, 0
; XTENSA-ATOMIC-NEXT: movi a9, 1
; XTENSA-ATOMIC-NEXT: movi a10, 2
; XTENSA-ATOMIC-NEXT: movi a11, 0
; XTENSA-ATOMIC-NEXT: or a8, a12, a12
; 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 a12, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a13, 1, .LBB26_6
; XTENSA-ATOMIC-NEXT: .LBB26_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: bltu a12, a10, .LBB26_4
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a9, a9
; XTENSA-ATOMIC-NEXT: .LBB26_4: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-ATOMIC-NEXT: wsr a12, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a13, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a12, .LBB26_1
; XTENSA-ATOMIC-NEXT: # %bb.5: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB26_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a13, a11, a11
; XTENSA-ATOMIC-NEXT: j .LBB26_1
; XTENSA-ATOMIC-NEXT: .LBB26_6: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw umin ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define i32 @rmw32_xchg_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_xchg_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 32
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a11, 1
; XTENSA-NEXT: movi a12, 5
; XTENSA-NEXT: l32r a8, .LCPI27_0
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_xchg_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, 1
; XTENSA-ATOMIC-NEXT: movi a10, 0
; 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 a11, a8, a8
; XTENSA-ATOMIC-NEXT: beqi a12, 1, .LBB27_4
; XTENSA-ATOMIC-NEXT: .LBB27_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: wsr a11, scompare1
; XTENSA-ATOMIC-NEXT: or a8, a9, a9
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a12, a9, a9
; XTENSA-ATOMIC-NEXT: beq a8, a11, .LBB27_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB27_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a12, a10, a10
; XTENSA-ATOMIC-NEXT: j .LBB27_1
; XTENSA-ATOMIC-NEXT: .LBB27_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw xchg ptr %p, i32 1 seq_cst, align 4
ret i32 %v
}
define float @rmw32_fadd_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_fadd_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a10, a2, 0
; XTENSA-NEXT: l32r a6, .LCPI28_1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI28_2
; XTENSA-NEXT: .LBB28_1: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a10, a1, 0
; XTENSA-NEXT: l32r a11, .LCPI28_0
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: or a12, a10, a10
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: or a8, a10, a10
; XTENSA-NEXT: l32i a10, a1, 0
; XTENSA-NEXT: beqz a8, .LBB28_1
; XTENSA-NEXT: # %bb.2: # %atomicrmw.end
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_fadd_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a2, 0
; XTENSA-ATOMIC-NEXT: l32r a6, .LCPI28_1
; XTENSA-ATOMIC-NEXT: movi a5, 0
; XTENSA-ATOMIC-NEXT: movi a4, 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 a7, a10, a10
; XTENSA-ATOMIC-NEXT: beqi a8, 1, .LBB28_4
; XTENSA-ATOMIC-NEXT: .LBB28_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a11, .LCPI28_0
; XTENSA-ATOMIC-NEXT: or a10, a7, a7
; XTENSA-ATOMIC-NEXT: callx8 a6
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a10, a2, 0
; XTENSA-ATOMIC-NEXT: or a8, a4, a4
; XTENSA-ATOMIC-NEXT: beq a10, a7, .LBB28_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB28_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a5, a5
; XTENSA-ATOMIC-NEXT: j .LBB28_1
; XTENSA-ATOMIC-NEXT: .LBB28_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a10, a10
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw fadd ptr %p, float 1.0 seq_cst, align 4
ret float %v
}
define float @rmw32_fsub_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_fsub_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a10, a2, 0
; XTENSA-NEXT: l32r a6, .LCPI29_1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI29_2
; XTENSA-NEXT: .LBB29_1: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a10, a1, 0
; XTENSA-NEXT: l32r a11, .LCPI29_0
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: or a12, a10, a10
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: or a8, a10, a10
; XTENSA-NEXT: l32i a10, a1, 0
; XTENSA-NEXT: beqz a8, .LBB29_1
; XTENSA-NEXT: # %bb.2: # %atomicrmw.end
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_fsub_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a2, 0
; XTENSA-ATOMIC-NEXT: l32r a6, .LCPI29_1
; XTENSA-ATOMIC-NEXT: movi a5, 0
; XTENSA-ATOMIC-NEXT: movi a4, 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 a7, a10, a10
; XTENSA-ATOMIC-NEXT: beqi a8, 1, .LBB29_4
; XTENSA-ATOMIC-NEXT: .LBB29_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a11, .LCPI29_0
; XTENSA-ATOMIC-NEXT: or a10, a7, a7
; XTENSA-ATOMIC-NEXT: callx8 a6
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a10, a2, 0
; XTENSA-ATOMIC-NEXT: or a8, a4, a4
; XTENSA-ATOMIC-NEXT: beq a10, a7, .LBB29_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB29_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a5, a5
; XTENSA-ATOMIC-NEXT: j .LBB29_1
; XTENSA-ATOMIC-NEXT: .LBB29_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a10, a10
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw fsub ptr %p, float 1.0 seq_cst, align 4
ret float %v
}
define float @rmw32_fmin_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_fmin_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a10, a2, 0
; XTENSA-NEXT: l32r a6, .LCPI30_1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI30_2
; XTENSA-NEXT: .LBB30_1: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a10, a1, 0
; XTENSA-NEXT: l32r a11, .LCPI30_0
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: or a12, a10, a10
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: or a8, a10, a10
; XTENSA-NEXT: l32i a10, a1, 0
; XTENSA-NEXT: beqz a8, .LBB30_1
; XTENSA-NEXT: # %bb.2: # %atomicrmw.end
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_fmin_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a2, 0
; XTENSA-ATOMIC-NEXT: l32r a6, .LCPI30_1
; XTENSA-ATOMIC-NEXT: movi a5, 0
; XTENSA-ATOMIC-NEXT: movi a4, 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 a7, a10, a10
; XTENSA-ATOMIC-NEXT: beqi a8, 1, .LBB30_4
; XTENSA-ATOMIC-NEXT: .LBB30_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a11, .LCPI30_0
; XTENSA-ATOMIC-NEXT: or a10, a7, a7
; XTENSA-ATOMIC-NEXT: callx8 a6
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a10, a2, 0
; XTENSA-ATOMIC-NEXT: or a8, a4, a4
; XTENSA-ATOMIC-NEXT: beq a10, a7, .LBB30_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB30_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a5, a5
; XTENSA-ATOMIC-NEXT: j .LBB30_1
; XTENSA-ATOMIC-NEXT: .LBB30_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a10, a10
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw fmin ptr %p, float 1.0 seq_cst, align 4
ret float %v
}
define float @rmw32_fmax_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: rmw32_fmax_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: l32i a10, a2, 0
; XTENSA-NEXT: l32r a6, .LCPI31_1
; XTENSA-NEXT: movi a7, 5
; XTENSA-NEXT: l32r a5, .LCPI31_2
; XTENSA-NEXT: .LBB31_1: # %atomicrmw.start
; XTENSA-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-NEXT: s32i a10, a1, 0
; XTENSA-NEXT: l32r a11, .LCPI31_0
; XTENSA-NEXT: callx8 a6
; XTENSA-NEXT: or a12, a10, a10
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: or a13, a7, a7
; XTENSA-NEXT: or a14, a7, a7
; XTENSA-NEXT: callx8 a5
; XTENSA-NEXT: or a8, a10, a10
; XTENSA-NEXT: l32i a10, a1, 0
; XTENSA-NEXT: beqz a8, .LBB31_1
; XTENSA-NEXT: # %bb.2: # %atomicrmw.end
; XTENSA-NEXT: or a2, a10, a10
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: rmw32_fmax_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: l32i a7, a2, 0
; XTENSA-ATOMIC-NEXT: l32r a6, .LCPI31_1
; XTENSA-ATOMIC-NEXT: movi a5, 0
; XTENSA-ATOMIC-NEXT: movi a4, 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 a7, a10, a10
; XTENSA-ATOMIC-NEXT: beqi a8, 1, .LBB31_4
; XTENSA-ATOMIC-NEXT: .LBB31_2: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # =>This Inner Loop Header: Depth=1
; XTENSA-ATOMIC-NEXT: l32r a11, .LCPI31_0
; XTENSA-ATOMIC-NEXT: or a10, a7, a7
; XTENSA-ATOMIC-NEXT: callx8 a6
; XTENSA-ATOMIC-NEXT: wsr a7, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a10, a2, 0
; XTENSA-ATOMIC-NEXT: or a8, a4, a4
; XTENSA-ATOMIC-NEXT: beq a10, a7, .LBB31_1
; XTENSA-ATOMIC-NEXT: # %bb.3: # %atomicrmw.start
; XTENSA-ATOMIC-NEXT: # in Loop: Header=BB31_2 Depth=1
; XTENSA-ATOMIC-NEXT: or a8, a5, a5
; XTENSA-ATOMIC-NEXT: j .LBB31_1
; XTENSA-ATOMIC-NEXT: .LBB31_4: # %atomicrmw.end
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a10, a10
; XTENSA-ATOMIC-NEXT: retw
%v = atomicrmw fmax ptr %p, float 1.0 seq_cst, align 4
ret float %v
}
define i32 @cmpxchg32_monotonic(ptr %p) nounwind {
; XTENSA-LABEL: cmpxchg32_monotonic:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a13, 0
; XTENSA-NEXT: s32i a13, a1, 0
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: movi a12, 1
; XTENSA-NEXT: l32r a8, .LCPI32_0
; XTENSA-NEXT: or a14, a13, a13
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: cmpxchg32_monotonic:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: movi a8, 1
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: wsr a9, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = cmpxchg ptr %p, i32 0, i32 1 monotonic monotonic
%res.0 = extractvalue { i32, i1 } %res, 0
ret i32 %res.0
}
define i32 @cmpxchg32_seq_cst(ptr %p) nounwind {
; XTENSA-LABEL: cmpxchg32_seq_cst:
; XTENSA: # %bb.0:
; XTENSA-NEXT: entry a1, 48
; XTENSA-NEXT: or a10, a2, a2
; XTENSA-NEXT: movi a8, 0
; XTENSA-NEXT: s32i a8, a1, 0
; XTENSA-NEXT: addi a11, a1, 0
; XTENSA-NEXT: movi a12, 1
; XTENSA-NEXT: movi a13, 5
; XTENSA-NEXT: l32r a8, .LCPI33_0
; XTENSA-NEXT: or a14, a13, a13
; XTENSA-NEXT: callx8 a8
; XTENSA-NEXT: l32i a2, a1, 0
; XTENSA-NEXT: retw
;
; XTENSA-ATOMIC-LABEL: cmpxchg32_seq_cst:
; XTENSA-ATOMIC: # %bb.0:
; XTENSA-ATOMIC-NEXT: entry a1, 32
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: movi a8, 1
; XTENSA-ATOMIC-NEXT: movi a9, 0
; XTENSA-ATOMIC-NEXT: wsr a9, scompare1
; XTENSA-ATOMIC-NEXT: s32c1i a8, a2, 0
; XTENSA-ATOMIC-NEXT: memw
; XTENSA-ATOMIC-NEXT: or a2, a8, a8
; XTENSA-ATOMIC-NEXT: retw
%res = cmpxchg ptr %p, i32 0, i32 1 seq_cst seq_cst
%res.0 = extractvalue { i32, i1 } %res, 0
ret i32 %res.0
}