; 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
}
