[llvm] f0ec83e - [PowerPC][NFC] Pre-commit test case for an upcoming atomics patch

Nemanja Ivanovic via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 27 16:52:51 PDT 2022


Author: Nemanja Ivanovic
Date: 2022-09-27T18:52:41-05:00
New Revision: f0ec83eb0a4bceb8e030ffd5c4836fcf84e83662

URL: https://github.com/llvm/llvm-project/commit/f0ec83eb0a4bceb8e030ffd5c4836fcf84e83662
DIFF: https://github.com/llvm/llvm-project/commit/f0ec83eb0a4bceb8e030ffd5c4836fcf84e83662.diff

LOG: [PowerPC][NFC] Pre-commit test case for an upcoming atomics patch

Just a new test case with auto generated checks.

Added: 
    llvm/test/CodeGen/PowerPC/all-atomics.ll

Modified: 
    

Removed: 
    


################################################################################
diff  --git a/llvm/test/CodeGen/PowerPC/all-atomics.ll b/llvm/test/CodeGen/PowerPC/all-atomics.ll
new file mode 100644
index 0000000000000..96fbaca201eca
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/all-atomics.ll
@@ -0,0 +1,6010 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=powerpc64le-linux-gnu -mcpu=pwr8 -verify-machineinstrs \
+; RUN:   < %s | FileCheck %s
+; RUN: llc -mtriple=powerpc-aix- -mcpu=pwr7 -verify-machineinstrs \
+; RUN:   < %s | FileCheck %s --check-prefix=AIX32
+; ModuleID = '../clang/test/CodeGen/Atomics.c'
+
+ at sc = dso_local global i8 0, align 1
+ at uc = dso_local global i8 0, align 1
+ at ss = dso_local global i16 0, align 2
+ at us = dso_local global i16 0, align 2
+ at si = dso_local global i32 0, align 4
+ at ui = dso_local global i32 0, align 4
+ at sll = dso_local global i64 0, align 8
+ at ull = dso_local global i64 0, align 8
+ at u128 = dso_local global i128 0, align 16
+ at s128 = dso_local global i128 0, align 16
+
+define dso_local void @test_op_ignore() local_unnamed_addr #0 {
+; CHECK-LABEL: test_op_ignore:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 3, 2, sc at toc@ha
+; CHECK-NEXT:    std 26, -48(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 27, -40(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 28, -32(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 29, -24(1) # 8-byte Folded Spill
+; CHECK-NEXT:    addi 4, 3, sc at toc@l
+; CHECK-NEXT:    li 3, 1
+; CHECK-NEXT:    std 30, -16(1) # 8-byte Folded Spill
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 4
+; CHECK-NEXT:    addi 5, 5, 1
+; CHECK-NEXT:    stbcx. 5, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_1
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    addis 5, 2, uc at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 5, 5, uc at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_3: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 6, 0, 5
+; CHECK-NEXT:    addi 6, 6, 1
+; CHECK-NEXT:    stbcx. 6, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_3
+; CHECK-NEXT:  # %bb.4: # %entry
+; CHECK-NEXT:    addis 6, 2, ss at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 6, 6, ss at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 7, 0, 6
+; CHECK-NEXT:    addi 7, 7, 1
+; CHECK-NEXT:    sthcx. 7, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_5
+; CHECK-NEXT:  # %bb.6: # %entry
+; CHECK-NEXT:    addis 7, 2, us at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 8, 7, us at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_7: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 7, 0, 8
+; CHECK-NEXT:    addi 7, 7, 1
+; CHECK-NEXT:    sthcx. 7, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_7
+; CHECK-NEXT:  # %bb.8: # %entry
+; CHECK-NEXT:    addis 7, 2, si at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 9, 7, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_9: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 7, 0, 9
+; CHECK-NEXT:    addi 7, 7, 1
+; CHECK-NEXT:    stwcx. 7, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_9
+; CHECK-NEXT:  # %bb.10: # %entry
+; CHECK-NEXT:    addis 7, 2, ui at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 10, 7, ui at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_11: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 7, 0, 10
+; CHECK-NEXT:    addi 7, 7, 1
+; CHECK-NEXT:    stwcx. 7, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_11
+; CHECK-NEXT:  # %bb.12: # %entry
+; CHECK-NEXT:    addis 7, 2, sll at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 11, 7, sll at toc@l
+; CHECK-NEXT:    li 7, 1
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_13: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 12, 0, 11
+; CHECK-NEXT:    addi 12, 12, 1
+; CHECK-NEXT:    stdcx. 12, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_13
+; CHECK-NEXT:  # %bb.14: # %entry
+; CHECK-NEXT:    addis 12, 2, ull at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addi 12, 12, ull at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_15: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 30, 0, 12
+; CHECK-NEXT:    addi 0, 30, 1
+; CHECK-NEXT:    stdcx. 0, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_15
+; CHECK-NEXT:  # %bb.16: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_17: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 4
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    stbcx. 0, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_17
+; CHECK-NEXT:  # %bb.18: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_19: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 5
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    stbcx. 0, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_19
+; CHECK-NEXT:  # %bb.20: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_21: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 6
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    sthcx. 0, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_21
+; CHECK-NEXT:  # %bb.22: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_23: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 8
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    sthcx. 0, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_23
+; CHECK-NEXT:  # %bb.24: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_25: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 9
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    stwcx. 0, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_25
+; CHECK-NEXT:  # %bb.26: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_27: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 10
+; CHECK-NEXT:    sub 0, 0, 3
+; CHECK-NEXT:    stwcx. 0, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_27
+; CHECK-NEXT:  # %bb.28: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_29: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 11
+; CHECK-NEXT:    sub 0, 0, 7
+; CHECK-NEXT:    stdcx. 0, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_29
+; CHECK-NEXT:  # %bb.30: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_31: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 12
+; CHECK-NEXT:    sub 0, 0, 7
+; CHECK-NEXT:    stdcx. 0, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_31
+; CHECK-NEXT:  # %bb.32: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_33: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 4
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stbcx. 0, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_33
+; CHECK-NEXT:  # %bb.34: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_35: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 5
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stbcx. 0, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_35
+; CHECK-NEXT:  # %bb.36: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_37: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 6
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    sthcx. 0, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_37
+; CHECK-NEXT:  # %bb.38: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_39: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 8
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    sthcx. 0, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_39
+; CHECK-NEXT:  # %bb.40: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_41: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 9
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stwcx. 0, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_41
+; CHECK-NEXT:  # %bb.42: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_43: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 10
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stwcx. 0, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_43
+; CHECK-NEXT:  # %bb.44: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_45: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 11
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stdcx. 0, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_45
+; CHECK-NEXT:  # %bb.46: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_47: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 12
+; CHECK-NEXT:    ori 0, 0, 1
+; CHECK-NEXT:    stdcx. 0, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_47
+; CHECK-NEXT:  # %bb.48: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_49: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 4
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stbcx. 0, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_49
+; CHECK-NEXT:  # %bb.50: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_51: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 5
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stbcx. 0, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_51
+; CHECK-NEXT:  # %bb.52: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_53: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 6
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    sthcx. 0, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_53
+; CHECK-NEXT:  # %bb.54: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_55: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 8
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    sthcx. 0, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_55
+; CHECK-NEXT:  # %bb.56: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_57: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 9
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stwcx. 0, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_57
+; CHECK-NEXT:  # %bb.58: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_59: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 10
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stwcx. 0, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_59
+; CHECK-NEXT:  # %bb.60: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_61: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 11
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stdcx. 0, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_61
+; CHECK-NEXT:  # %bb.62: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_63: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 12
+; CHECK-NEXT:    xori 0, 0, 1
+; CHECK-NEXT:    stdcx. 0, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_63
+; CHECK-NEXT:  # %bb.64: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addis 30, 2, u128 at toc@ha
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    addi 0, 30, u128 at toc@l
+; CHECK-NEXT:    li 30, 0
+; CHECK-NEXT:  .LBB0_65: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lqarx 28, 0, 0
+; CHECK-NEXT:    xor 27, 7, 29
+; CHECK-NEXT:    xor 26, 30, 28
+; CHECK-NEXT:    stqcx. 26, 0, 0
+; CHECK-NEXT:    bne 0, .LBB0_65
+; CHECK-NEXT:  # %bb.66: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addis 29, 2, s128 at toc@ha
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    addi 0, 29, s128 at toc@l
+; CHECK-NEXT:  .LBB0_67: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lqarx 28, 0, 0
+; CHECK-NEXT:    xor 27, 7, 29
+; CHECK-NEXT:    xor 26, 30, 28
+; CHECK-NEXT:    stqcx. 26, 0, 0
+; CHECK-NEXT:    bne 0, .LBB0_67
+; CHECK-NEXT:  # %bb.68: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_69: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 4
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    stbcx. 0, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_69
+; CHECK-NEXT:  # %bb.70: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_71: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 5
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    stbcx. 0, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_71
+; CHECK-NEXT:  # %bb.72: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_73: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 6
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    sthcx. 0, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_73
+; CHECK-NEXT:  # %bb.74: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_75: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 8
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    sthcx. 0, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_75
+; CHECK-NEXT:  # %bb.76: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_77: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 9
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    stwcx. 0, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_77
+; CHECK-NEXT:  # %bb.78: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_79: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 0, 0, 10
+; CHECK-NEXT:    nand 0, 3, 0
+; CHECK-NEXT:    stwcx. 0, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_79
+; CHECK-NEXT:  # %bb.80: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_81: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 11
+; CHECK-NEXT:    nand 0, 7, 0
+; CHECK-NEXT:    stdcx. 0, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_81
+; CHECK-NEXT:  # %bb.82: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_83: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 0, 0, 12
+; CHECK-NEXT:    nand 0, 7, 0
+; CHECK-NEXT:    stdcx. 0, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_83
+; CHECK-NEXT:  # %bb.84: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_85: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 0, 0, 4
+; CHECK-NEXT:    and 0, 3, 0
+; CHECK-NEXT:    stbcx. 0, 0, 4
+; CHECK-NEXT:    bne 0, .LBB0_85
+; CHECK-NEXT:  # %bb.86: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_87: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 4, 0, 5
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    stbcx. 4, 0, 5
+; CHECK-NEXT:    bne 0, .LBB0_87
+; CHECK-NEXT:  # %bb.88: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_89: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 4, 0, 6
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    sthcx. 4, 0, 6
+; CHECK-NEXT:    bne 0, .LBB0_89
+; CHECK-NEXT:  # %bb.90: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_91: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 4, 0, 8
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    sthcx. 4, 0, 8
+; CHECK-NEXT:    bne 0, .LBB0_91
+; CHECK-NEXT:  # %bb.92: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_93: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 4, 0, 9
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    stwcx. 4, 0, 9
+; CHECK-NEXT:    bne 0, .LBB0_93
+; CHECK-NEXT:  # %bb.94: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_95: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 4, 0, 10
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    stwcx. 4, 0, 10
+; CHECK-NEXT:    bne 0, .LBB0_95
+; CHECK-NEXT:  # %bb.96: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_97: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 3, 0, 11
+; CHECK-NEXT:    and 3, 7, 3
+; CHECK-NEXT:    stdcx. 3, 0, 11
+; CHECK-NEXT:    bne 0, .LBB0_97
+; CHECK-NEXT:  # %bb.98: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB0_99: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 3, 0, 12
+; CHECK-NEXT:    and 3, 7, 3
+; CHECK-NEXT:    stdcx. 3, 0, 12
+; CHECK-NEXT:    bne 0, .LBB0_99
+; CHECK-NEXT:  # %bb.100: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 29, -24(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 28, -32(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 27, -40(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 26, -48(1) # 8-byte Folded Reload
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_op_ignore:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -160(1)
+; AIX32-NEXT:    lwz 3, L..C0(2) # @sc
+; AIX32-NEXT:    stw 15, 92(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 26, 136(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 28, 144(1) # 4-byte Folded Spill
+; AIX32-NEXT:    li 15, 1
+; AIX32-NEXT:    stw 16, 96(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 17, 100(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 4, 3, 3, 27, 28
+; AIX32-NEXT:    rlwinm 28, 3, 0, 0, 29
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    xori 26, 4, 24
+; AIX32-NEXT:    stw 18, 104(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 19, 108(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 20, 112(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 21, 116(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 22, 120(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 23, 124(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 24, 128(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 25, 132(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 27, 140(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 29, 148(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 30, 152(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 156(1) # 4-byte Folded Spill
+; AIX32-NEXT:    slw 29, 15, 26
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    add 5, 29, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_1
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    lwz 3, L..C1(2) # @uc
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 4, 3, 3, 27, 28
+; AIX32-NEXT:    rlwinm 27, 3, 0, 0, 29
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    xori 24, 4, 24
+; AIX32-NEXT:    slw 18, 15, 24
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:  L..BB0_3: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    add 5, 18, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_3
+; AIX32-NEXT:  # %bb.4: # %entry
+; AIX32-NEXT:    lwz 3, L..C2(2) # @ss
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 4, 3, 3, 27, 27
+; AIX32-NEXT:    rlwinm 25, 3, 0, 0, 29
+; AIX32-NEXT:    ori 3, 5, 65535
+; AIX32-NEXT:    xori 22, 4, 16
+; AIX32-NEXT:    slw 17, 15, 22
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    add 5, 17, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_5
+; AIX32-NEXT:  # %bb.6: # %entry
+; AIX32-NEXT:    lwz 3, L..C3(2) # @us
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 4, 3, 3, 27, 27
+; AIX32-NEXT:    rlwinm 23, 3, 0, 0, 29
+; AIX32-NEXT:    ori 3, 5, 65535
+; AIX32-NEXT:    xori 19, 4, 16
+; AIX32-NEXT:    slw 16, 15, 19
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_7: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    add 5, 16, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_7
+; AIX32-NEXT:  # %bb.8: # %entry
+; AIX32-NEXT:    lwz 21, L..C4(2) # @si
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_9: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    addi 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_9
+; AIX32-NEXT:  # %bb.10: # %entry
+; AIX32-NEXT:    lwz 20, L..C5(2) # @ui
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_11: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    addi 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_11
+; AIX32-NEXT:  # %bb.12: # %entry
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:  L..BB0_13: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    sub 5, 4, 29
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_13
+; AIX32-NEXT:  # %bb.14: # %entry
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_15: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    sub 5, 4, 18
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_15
+; AIX32-NEXT:  # %bb.16: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_17: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    sub 5, 4, 17
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_17
+; AIX32-NEXT:  # %bb.18: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_19: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    sub 5, 4, 16
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_19
+; AIX32-NEXT:  # %bb.20: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_21: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    sub 3, 3, 15
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_21
+; AIX32-NEXT:  # %bb.22: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_23: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    sub 3, 3, 15
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_23
+; AIX32-NEXT:  # %bb.24: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:  L..BB0_25: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    or 5, 29, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_25
+; AIX32-NEXT:  # %bb.26: # %entry
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_27: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    or 5, 18, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_27
+; AIX32-NEXT:  # %bb.28: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_29: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    or 5, 17, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_29
+; AIX32-NEXT:  # %bb.30: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_31: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    or 5, 16, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_31
+; AIX32-NEXT:  # %bb.32: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_33: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    ori 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_33
+; AIX32-NEXT:  # %bb.34: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_35: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    ori 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_35
+; AIX32-NEXT:  # %bb.36: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:  L..BB0_37: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    xor 5, 29, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_37
+; AIX32-NEXT:  # %bb.38: # %entry
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_39: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    xor 5, 18, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_39
+; AIX32-NEXT:  # %bb.40: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_41: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    xor 5, 17, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_41
+; AIX32-NEXT:  # %bb.42: # %entry
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_43: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    xor 5, 16, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_43
+; AIX32-NEXT:  # %bb.44: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_45: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    xori 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_45
+; AIX32-NEXT:  # %bb.46: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_47: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    xori 3, 3, 1
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_47
+; AIX32-NEXT:  # %bb.48: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 31, L..C8(2) # @u128
+; AIX32-NEXT:    addi 30, 1, 72
+; AIX32-NEXT:    addi 29, 1, 56
+; AIX32-NEXT:    lwz 5, 12(31)
+; AIX32-NEXT:    lwz 3, 8(31)
+; AIX32-NEXT:    lwz 4, 4(31)
+; AIX32-NEXT:    lwz 9, 0(31)
+; AIX32-NEXT:    .align 4
+; AIX32-NEXT:  L..BB0_49: # %atomicrmw.start
+; AIX32-NEXT:    #
+; AIX32-NEXT:    xori 6, 5, 1
+; AIX32-NEXT:    stw 4, 76(1)
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    stw 3, 80(1)
+; AIX32-NEXT:    stw 5, 84(1)
+; AIX32-NEXT:    stw 3, 64(1)
+; AIX32-NEXT:    stw 4, 60(1)
+; AIX32-NEXT:    stw 6, 68(1)
+; AIX32-NEXT:    li 3, 16
+; AIX32-NEXT:    mr 4, 31
+; AIX32-NEXT:    mr 5, 30
+; AIX32-NEXT:    mr 6, 29
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    stw 9, 72(1)
+; AIX32-NEXT:    stw 9, 56(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    cmplwi 3, 0
+; AIX32-NEXT:    lwz 5, 84(1)
+; AIX32-NEXT:    lwz 3, 80(1)
+; AIX32-NEXT:    lwz 4, 76(1)
+; AIX32-NEXT:    lwz 9, 72(1)
+; AIX32-NEXT:    beq 0, L..BB0_49
+; AIX32-NEXT:  # %bb.50: # %atomicrmw.end
+; AIX32-NEXT:    lwz 31, L..C9(2) # @s128
+; AIX32-NEXT:    addi 30, 1, 72
+; AIX32-NEXT:    addi 29, 1, 56
+; AIX32-NEXT:    lwz 5, 12(31)
+; AIX32-NEXT:    lwz 3, 8(31)
+; AIX32-NEXT:    lwz 4, 4(31)
+; AIX32-NEXT:    lwz 9, 0(31)
+; AIX32-NEXT:    .align 4
+; AIX32-NEXT:  L..BB0_51: # %atomicrmw.start2
+; AIX32-NEXT:    #
+; AIX32-NEXT:    xori 6, 5, 1
+; AIX32-NEXT:    stw 4, 76(1)
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    stw 3, 80(1)
+; AIX32-NEXT:    stw 5, 84(1)
+; AIX32-NEXT:    stw 3, 64(1)
+; AIX32-NEXT:    stw 4, 60(1)
+; AIX32-NEXT:    stw 6, 68(1)
+; AIX32-NEXT:    li 3, 16
+; AIX32-NEXT:    mr 4, 31
+; AIX32-NEXT:    mr 5, 30
+; AIX32-NEXT:    mr 6, 29
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    stw 9, 72(1)
+; AIX32-NEXT:    stw 9, 56(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    cmplwi 3, 0
+; AIX32-NEXT:    lwz 5, 84(1)
+; AIX32-NEXT:    lwz 3, 80(1)
+; AIX32-NEXT:    lwz 4, 76(1)
+; AIX32-NEXT:    lwz 9, 72(1)
+; AIX32-NEXT:    beq 0, L..BB0_51
+; AIX32-NEXT:  # %bb.52: # %atomicrmw.end1
+; AIX32-NEXT:    li 29, 1
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 18, 29, 26
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:  L..BB0_53: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    nand 5, 18, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_53
+; AIX32-NEXT:  # %bb.54: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 17, 29, 24
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_55: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    nand 5, 17, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_55
+; AIX32-NEXT:  # %bb.56: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 16, 29, 22
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_57: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    nand 5, 16, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_57
+; AIX32-NEXT:  # %bb.58: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 15, 29, 19
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_59: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    nand 5, 15, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_59
+; AIX32-NEXT:  # %bb.60: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_61: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    nand 3, 29, 3
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_61
+; AIX32-NEXT:  # %bb.62: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_63: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    nand 3, 29, 3
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_63
+; AIX32-NEXT:  # %bb.64: # %atomicrmw.end1
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 26
+; AIX32-NEXT:  L..BB0_65: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 28
+; AIX32-NEXT:    and 5, 18, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB0_65
+; AIX32-NEXT:  # %bb.66: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    slw 3, 3, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_67: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    and 5, 17, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:    bne 0, L..BB0_67
+; AIX32-NEXT:  # %bb.68: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB0_69: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    and 5, 16, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 25
+; AIX32-NEXT:    bne 0, L..BB0_69
+; AIX32-NEXT:  # %bb.70: # %atomicrmw.end1
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    ori 3, 3, 65535
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 3, 3, 19
+; AIX32-NEXT:  L..BB0_71: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 23
+; AIX32-NEXT:    and 5, 15, 4
+; AIX32-NEXT:    andc 4, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 4, 5, 4
+; AIX32-NEXT:    stwcx. 4, 0, 23
+; AIX32-NEXT:    bne 0, L..BB0_71
+; AIX32-NEXT:  # %bb.72: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_73: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 21
+; AIX32-NEXT:    and 3, 29, 3
+; AIX32-NEXT:    stwcx. 3, 0, 21
+; AIX32-NEXT:    bne 0, L..BB0_73
+; AIX32-NEXT:  # %bb.74: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB0_75: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 20
+; AIX32-NEXT:    and 3, 29, 3
+; AIX32-NEXT:    stwcx. 3, 0, 20
+; AIX32-NEXT:    bne 0, L..BB0_75
+; AIX32-NEXT:  # %bb.76: # %atomicrmw.end1
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 31, 156(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 30, 152(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 29, 148(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 144(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 27, 140(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 26, 136(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 25, 132(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 24, 128(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 23, 124(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 22, 120(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 21, 116(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 20, 112(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 19, 108(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 18, 104(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 17, 100(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 16, 96(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 15, 92(1) # 4-byte Folded Reload
+; AIX32-NEXT:    addi 1, 1, 160
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw add ptr @sc, i8 1 seq_cst, align 1
+  %1 = atomicrmw add ptr @uc, i8 1 seq_cst, align 1
+  %2 = atomicrmw add ptr @ss, i16 1 seq_cst, align 2
+  %3 = atomicrmw add ptr @us, i16 1 seq_cst, align 2
+  %4 = atomicrmw add ptr @si, i32 1 seq_cst, align 4
+  %5 = atomicrmw add ptr @ui, i32 1 seq_cst, align 4
+  %6 = atomicrmw add ptr @sll, i64 1 seq_cst, align 8
+  %7 = atomicrmw add ptr @ull, i64 1 seq_cst, align 8
+  %8 = atomicrmw sub ptr @sc, i8 1 seq_cst, align 1
+  %9 = atomicrmw sub ptr @uc, i8 1 seq_cst, align 1
+  %10 = atomicrmw sub ptr @ss, i16 1 seq_cst, align 2
+  %11 = atomicrmw sub ptr @us, i16 1 seq_cst, align 2
+  %12 = atomicrmw sub ptr @si, i32 1 seq_cst, align 4
+  %13 = atomicrmw sub ptr @ui, i32 1 seq_cst, align 4
+  %14 = atomicrmw sub ptr @sll, i64 1 seq_cst, align 8
+  %15 = atomicrmw sub ptr @ull, i64 1 seq_cst, align 8
+  %16 = atomicrmw or ptr @sc, i8 1 seq_cst, align 1
+  %17 = atomicrmw or ptr @uc, i8 1 seq_cst, align 1
+  %18 = atomicrmw or ptr @ss, i16 1 seq_cst, align 2
+  %19 = atomicrmw or ptr @us, i16 1 seq_cst, align 2
+  %20 = atomicrmw or ptr @si, i32 1 seq_cst, align 4
+  %21 = atomicrmw or ptr @ui, i32 1 seq_cst, align 4
+  %22 = atomicrmw or ptr @sll, i64 1 seq_cst, align 8
+  %23 = atomicrmw or ptr @ull, i64 1 seq_cst, align 8
+  %24 = atomicrmw xor ptr @sc, i8 1 seq_cst, align 1
+  %25 = atomicrmw xor ptr @uc, i8 1 seq_cst, align 1
+  %26 = atomicrmw xor ptr @ss, i16 1 seq_cst, align 2
+  %27 = atomicrmw xor ptr @us, i16 1 seq_cst, align 2
+  %28 = atomicrmw xor ptr @si, i32 1 seq_cst, align 4
+  %29 = atomicrmw xor ptr @ui, i32 1 seq_cst, align 4
+  %30 = atomicrmw xor ptr @sll, i64 1 seq_cst, align 8
+  %31 = atomicrmw xor ptr @ull, i64 1 seq_cst, align 8
+  %32 = atomicrmw xor ptr @u128, i128 1 seq_cst, align 16
+  %33 = atomicrmw xor ptr @s128, i128 1 seq_cst, align 16
+  %34 = atomicrmw nand ptr @sc, i8 1 seq_cst, align 1
+  %35 = atomicrmw nand ptr @uc, i8 1 seq_cst, align 1
+  %36 = atomicrmw nand ptr @ss, i16 1 seq_cst, align 2
+  %37 = atomicrmw nand ptr @us, i16 1 seq_cst, align 2
+  %38 = atomicrmw nand ptr @si, i32 1 seq_cst, align 4
+  %39 = atomicrmw nand ptr @ui, i32 1 seq_cst, align 4
+  %40 = atomicrmw nand ptr @sll, i64 1 seq_cst, align 8
+  %41 = atomicrmw nand ptr @ull, i64 1 seq_cst, align 8
+  %42 = atomicrmw and ptr @sc, i8 1 seq_cst, align 1
+  %43 = atomicrmw and ptr @uc, i8 1 seq_cst, align 1
+  %44 = atomicrmw and ptr @ss, i16 1 seq_cst, align 2
+  %45 = atomicrmw and ptr @us, i16 1 seq_cst, align 2
+  %46 = atomicrmw and ptr @si, i32 1 seq_cst, align 4
+  %47 = atomicrmw and ptr @ui, i32 1 seq_cst, align 4
+  %48 = atomicrmw and ptr @sll, i64 1 seq_cst, align 8
+  %49 = atomicrmw and ptr @ull, i64 1 seq_cst, align 8
+  ret void
+}
+
+define dso_local void @test_fetch_and_op() local_unnamed_addr #0 {
+; CHECK-LABEL: test_fetch_and_op:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 4, 2, sc at toc@ha
+; CHECK-NEXT:    std 22, -80(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 23, -72(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 24, -64(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 25, -56(1) # 8-byte Folded Spill
+; CHECK-NEXT:    li 3, 11
+; CHECK-NEXT:    addi 6, 4, sc at toc@l
+; CHECK-NEXT:    std 26, -48(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 27, -40(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 28, -32(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 29, -24(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 30, -16(1) # 8-byte Folded Spill
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 6
+; CHECK-NEXT:    addi 7, 5, 11
+; CHECK-NEXT:    stbcx. 7, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_1
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 5, sc at toc@l(4)
+; CHECK-NEXT:    addis 5, 2, uc at toc@ha
+; CHECK-NEXT:    addi 8, 5, uc at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_3: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 7, 0, 8
+; CHECK-NEXT:    addi 9, 7, 11
+; CHECK-NEXT:    stbcx. 9, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_3
+; CHECK-NEXT:  # %bb.4: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 7, uc at toc@l(5)
+; CHECK-NEXT:    addis 7, 2, ss at toc@ha
+; CHECK-NEXT:    addi 10, 7, ss at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 9, 0, 10
+; CHECK-NEXT:    addi 11, 9, 11
+; CHECK-NEXT:    sthcx. 11, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_5
+; CHECK-NEXT:  # %bb.6: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 9, ss at toc@l(7)
+; CHECK-NEXT:    addis 9, 2, us at toc@ha
+; CHECK-NEXT:    addi 0, 9, us at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_7: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 11, 0, 0
+; CHECK-NEXT:    addi 12, 11, 11
+; CHECK-NEXT:    sthcx. 12, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_7
+; CHECK-NEXT:  # %bb.8: # %entry
+; CHECK-NEXT:    addis 12, 2, si at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 11, us at toc@l(9)
+; CHECK-NEXT:    addi 29, 12, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_9: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 11, 0, 29
+; CHECK-NEXT:    addi 30, 11, 11
+; CHECK-NEXT:    stwcx. 30, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_9
+; CHECK-NEXT:  # %bb.10: # %entry
+; CHECK-NEXT:    addis 30, 2, ui at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 11, si at toc@l(12)
+; CHECK-NEXT:    addi 27, 30, ui at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_11: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 11, 0, 27
+; CHECK-NEXT:    addi 28, 11, 11
+; CHECK-NEXT:    stwcx. 28, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_11
+; CHECK-NEXT:  # %bb.12: # %entry
+; CHECK-NEXT:    addis 28, 2, sll at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 11, ui at toc@l(30)
+; CHECK-NEXT:    li 11, 11
+; CHECK-NEXT:    addi 25, 28, sll at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_13: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 26, 0, 25
+; CHECK-NEXT:    addi 24, 26, 11
+; CHECK-NEXT:    stdcx. 24, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_13
+; CHECK-NEXT:  # %bb.14: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 26, sll at toc@l(28)
+; CHECK-NEXT:    addis 26, 2, ull at toc@ha
+; CHECK-NEXT:    addi 24, 26, ull at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_15: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 24
+; CHECK-NEXT:    addi 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_15
+; CHECK-NEXT:  # %bb.16: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, ull at toc@l(26)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_17: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 6
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    stbcx. 22, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_17
+; CHECK-NEXT:  # %bb.18: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_19: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 8
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    stbcx. 22, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_19
+; CHECK-NEXT:  # %bb.20: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, uc at toc@l(5)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_21: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 10
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    sthcx. 22, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_21
+; CHECK-NEXT:  # %bb.22: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, ss at toc@l(7)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_23: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 0
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    sthcx. 22, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_23
+; CHECK-NEXT:  # %bb.24: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, us at toc@l(9)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_25: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 29
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    stwcx. 22, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_25
+; CHECK-NEXT:  # %bb.26: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, si at toc@l(12)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_27: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 27
+; CHECK-NEXT:    sub 22, 23, 3
+; CHECK-NEXT:    stwcx. 22, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_27
+; CHECK-NEXT:  # %bb.28: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, ui at toc@l(30)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_29: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 25
+; CHECK-NEXT:    sub 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_29
+; CHECK-NEXT:  # %bb.30: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, sll at toc@l(28)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_31: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 24
+; CHECK-NEXT:    sub 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_31
+; CHECK-NEXT:  # %bb.32: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, ull at toc@l(26)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_33: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 6
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stbcx. 22, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_33
+; CHECK-NEXT:  # %bb.34: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_35: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 8
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stbcx. 22, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_35
+; CHECK-NEXT:  # %bb.36: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, uc at toc@l(5)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_37: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 10
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    sthcx. 22, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_37
+; CHECK-NEXT:  # %bb.38: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, ss at toc@l(7)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_39: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 0
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    sthcx. 22, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_39
+; CHECK-NEXT:  # %bb.40: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, us at toc@l(9)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_41: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 29
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stwcx. 22, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_41
+; CHECK-NEXT:  # %bb.42: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, si at toc@l(12)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_43: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 27
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stwcx. 22, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_43
+; CHECK-NEXT:  # %bb.44: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, ui at toc@l(30)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_45: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 25
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_45
+; CHECK-NEXT:  # %bb.46: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, sll at toc@l(28)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_47: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 24
+; CHECK-NEXT:    ori 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_47
+; CHECK-NEXT:  # %bb.48: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, ull at toc@l(26)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_49: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 6
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stbcx. 22, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_49
+; CHECK-NEXT:  # %bb.50: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_51: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 8
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stbcx. 22, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_51
+; CHECK-NEXT:  # %bb.52: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, uc at toc@l(5)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_53: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 10
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    sthcx. 22, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_53
+; CHECK-NEXT:  # %bb.54: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, ss at toc@l(7)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_55: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 0
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    sthcx. 22, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_55
+; CHECK-NEXT:  # %bb.56: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, us at toc@l(9)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_57: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 29
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stwcx. 22, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_57
+; CHECK-NEXT:  # %bb.58: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, si at toc@l(12)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_59: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 27
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stwcx. 22, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_59
+; CHECK-NEXT:  # %bb.60: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, ui at toc@l(30)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_61: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 25
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_61
+; CHECK-NEXT:  # %bb.62: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, sll at toc@l(28)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_63: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 24
+; CHECK-NEXT:    xori 22, 23, 11
+; CHECK-NEXT:    stdcx. 22, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_63
+; CHECK-NEXT:  # %bb.64: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, ull at toc@l(26)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_65: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 6
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    stbcx. 22, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_65
+; CHECK-NEXT:  # %bb.66: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_67: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 8
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    stbcx. 22, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_67
+; CHECK-NEXT:  # %bb.68: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, uc at toc@l(5)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_69: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 10
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    sthcx. 22, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_69
+; CHECK-NEXT:  # %bb.70: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, ss at toc@l(7)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_71: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 23, 0, 0
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    sthcx. 22, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_71
+; CHECK-NEXT:  # %bb.72: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 23, us at toc@l(9)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_73: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 29
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    stwcx. 22, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_73
+; CHECK-NEXT:  # %bb.74: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, si at toc@l(12)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_75: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 23, 0, 27
+; CHECK-NEXT:    nand 22, 3, 23
+; CHECK-NEXT:    stwcx. 22, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_75
+; CHECK-NEXT:  # %bb.76: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 23, ui at toc@l(30)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_77: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 25
+; CHECK-NEXT:    nand 22, 11, 23
+; CHECK-NEXT:    stdcx. 22, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_77
+; CHECK-NEXT:  # %bb.78: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, sll at toc@l(28)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_79: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 23, 0, 24
+; CHECK-NEXT:    nand 22, 11, 23
+; CHECK-NEXT:    stdcx. 22, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_79
+; CHECK-NEXT:  # %bb.80: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 23, ull at toc@l(26)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_81: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 23, 0, 6
+; CHECK-NEXT:    and 22, 3, 23
+; CHECK-NEXT:    stbcx. 22, 0, 6
+; CHECK-NEXT:    bne 0, .LBB1_81
+; CHECK-NEXT:  # %bb.82: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 23, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_83: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 4, 0, 8
+; CHECK-NEXT:    and 6, 3, 4
+; CHECK-NEXT:    stbcx. 6, 0, 8
+; CHECK-NEXT:    bne 0, .LBB1_83
+; CHECK-NEXT:  # %bb.84: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 4, uc at toc@l(5)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_85: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 4, 0, 10
+; CHECK-NEXT:    and 5, 3, 4
+; CHECK-NEXT:    sthcx. 5, 0, 10
+; CHECK-NEXT:    bne 0, .LBB1_85
+; CHECK-NEXT:  # %bb.86: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 4, ss at toc@l(7)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_87: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 4, 0, 0
+; CHECK-NEXT:    and 5, 3, 4
+; CHECK-NEXT:    sthcx. 5, 0, 0
+; CHECK-NEXT:    bne 0, .LBB1_87
+; CHECK-NEXT:  # %bb.88: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 4, us at toc@l(9)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_89: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 4, 0, 29
+; CHECK-NEXT:    and 5, 3, 4
+; CHECK-NEXT:    stwcx. 5, 0, 29
+; CHECK-NEXT:    bne 0, .LBB1_89
+; CHECK-NEXT:  # %bb.90: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 4, si at toc@l(12)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_91: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 4, 0, 27
+; CHECK-NEXT:    and 5, 3, 4
+; CHECK-NEXT:    stwcx. 5, 0, 27
+; CHECK-NEXT:    bne 0, .LBB1_91
+; CHECK-NEXT:  # %bb.92: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 4, ui at toc@l(30)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_93: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 3, 0, 25
+; CHECK-NEXT:    and 4, 11, 3
+; CHECK-NEXT:    stdcx. 4, 0, 25
+; CHECK-NEXT:    bne 0, .LBB1_93
+; CHECK-NEXT:  # %bb.94: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 3, sll at toc@l(28)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB1_95: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 3, 0, 24
+; CHECK-NEXT:    and 4, 11, 3
+; CHECK-NEXT:    stdcx. 4, 0, 24
+; CHECK-NEXT:    bne 0, .LBB1_95
+; CHECK-NEXT:  # %bb.96: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 3, ull at toc@l(26)
+; CHECK-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 29, -24(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 28, -32(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 27, -40(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 26, -48(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 25, -56(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 24, -64(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 23, -72(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 22, -80(1) # 8-byte Folded Reload
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_fetch_and_op:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -144(1)
+; AIX32-NEXT:    lwz 4, L..C0(2) # @sc
+; AIX32-NEXT:    stw 26, 120(1) # 4-byte Folded Spill
+; AIX32-NEXT:    li 7, 11
+; AIX32-NEXT:    stw 13, 68(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 14, 72(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 15, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 16, 80(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 3, 4, 3, 27, 28
+; AIX32-NEXT:    stw 17, 84(1) # 4-byte Folded Spill
+; AIX32-NEXT:    xori 26, 3, 24
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    stw 18, 88(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 19, 92(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 20, 96(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 21, 100(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 22, 104(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 23, 108(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 24, 112(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 25, 116(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 27, 124(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 28, 128(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 29, 132(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 30, 136(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 140(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 4, 64(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 24, 4, 0, 0, 29
+; AIX32-NEXT:    slw 23, 7, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 4, 3, 26
+; AIX32-NEXT:  L..BB1_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 24
+; AIX32-NEXT:    add 5, 23, 3
+; AIX32-NEXT:    andc 6, 3, 4
+; AIX32-NEXT:    and 5, 5, 4
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_1
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    lwz 27, L..C1(2) # @uc
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 3, 26
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    rlwinm 3, 27, 3, 27, 28
+; AIX32-NEXT:    xori 22, 3, 24
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 21, 27, 0, 0, 29
+; AIX32-NEXT:    slw 19, 7, 22
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:  L..BB1_3: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    add 5, 19, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_3
+; AIX32-NEXT:  # %bb.4: # %entry
+; AIX32-NEXT:    lwz 25, L..C2(2) # @ss
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    rlwinm 3, 25, 3, 27, 27
+; AIX32-NEXT:    rlwinm 17, 25, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 18, 3, 16
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 16, 7, 18
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:  L..BB1_5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    add 5, 16, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_5
+; AIX32-NEXT:  # %bb.6: # %entry
+; AIX32-NEXT:    lwz 20, L..C3(2) # @us
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    rlwinm 3, 20, 3, 27, 27
+; AIX32-NEXT:    rlwinm 13, 20, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 15, 3, 16
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 29, 7, 15
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:  L..BB1_7: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    add 5, 29, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_7
+; AIX32-NEXT:  # %bb.8: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwz 28, L..C4(2) # @si
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_9: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    addi 4, 3, 11
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_9
+; AIX32-NEXT:  # %bb.10: # %entry
+; AIX32-NEXT:    lwz 14, L..C5(2) # @ui
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_11: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 14
+; AIX32-NEXT:    addi 4, 3, 11
+; AIX32-NEXT:    stwcx. 4, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_11
+; AIX32-NEXT:  # %bb.12: # %entry
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(14)
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_13: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    sub 5, 4, 23
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_13
+; AIX32-NEXT:  # %bb.14: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 4, 26
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_15: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    sub 5, 4, 19
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_15
+; AIX32-NEXT:  # %bb.16: # %entry
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 8, 11
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_17: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    sub 5, 4, 16
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_17
+; AIX32-NEXT:  # %bb.18: # %entry
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_19: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    sub 5, 4, 29
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_19
+; AIX32-NEXT:  # %bb.20: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_21: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    sub 4, 3, 8
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_21
+; AIX32-NEXT:  # %bb.22: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_23: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 14
+; AIX32-NEXT:    sub 3, 7, 8
+; AIX32-NEXT:    stwcx. 3, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_23
+; AIX32-NEXT:  # %bb.24: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 7, 0(14)
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_25: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    or 5, 23, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_25
+; AIX32-NEXT:  # %bb.26: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 4, 26
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_27: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    or 5, 19, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_27
+; AIX32-NEXT:  # %bb.28: # %entry
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_29: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    or 5, 16, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_29
+; AIX32-NEXT:  # %bb.30: # %entry
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_31: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    or 5, 29, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_31
+; AIX32-NEXT:  # %bb.32: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_33: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    ori 4, 3, 11
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_33
+; AIX32-NEXT:  # %bb.34: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_35: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 14
+; AIX32-NEXT:    ori 3, 7, 11
+; AIX32-NEXT:    stwcx. 3, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_35
+; AIX32-NEXT:  # %bb.36: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 7, 0(14)
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_37: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    xor 5, 23, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_37
+; AIX32-NEXT:  # %bb.38: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 4, 26
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_39: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    xor 5, 19, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_39
+; AIX32-NEXT:  # %bb.40: # %entry
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_41: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    xor 5, 16, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_41
+; AIX32-NEXT:  # %bb.42: # %entry
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_43: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    xor 5, 29, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_43
+; AIX32-NEXT:  # %bb.44: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_45: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    xori 4, 3, 11
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_45
+; AIX32-NEXT:  # %bb.46: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_47: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 14
+; AIX32-NEXT:    xori 3, 7, 11
+; AIX32-NEXT:    stwcx. 3, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_47
+; AIX32-NEXT:  # %bb.48: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 7, 0(14)
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_49: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    nand 5, 23, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_49
+; AIX32-NEXT:  # %bb.50: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 4, 26
+; AIX32-NEXT:    li 8, 11
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_51: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    nand 5, 19, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_51
+; AIX32-NEXT:  # %bb.52: # %entry
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_53: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    nand 5, 16, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_53
+; AIX32-NEXT:  # %bb.54: # %entry
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_55: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    nand 5, 29, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_55
+; AIX32-NEXT:  # %bb.56: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_57: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    nand 4, 8, 3
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_57
+; AIX32-NEXT:  # %bb.58: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_59: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 14
+; AIX32-NEXT:    nand 3, 8, 7
+; AIX32-NEXT:    stwcx. 3, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_59
+; AIX32-NEXT:  # %bb.60: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 7, 0(14)
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 26
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_61: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    and 5, 23, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 24
+; AIX32-NEXT:    bne 0, L..BB1_61
+; AIX32-NEXT:  # %bb.62: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 4, 26
+; AIX32-NEXT:    lwz 4, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(4)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    slw 3, 3, 22
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_63: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 21
+; AIX32-NEXT:    and 5, 19, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 21
+; AIX32-NEXT:    bne 0, L..BB1_63
+; AIX32-NEXT:  # %bb.64: # %entry
+; AIX32-NEXT:    srw 3, 4, 22
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 8, 11
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    stb 3, 0(27)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_65: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    and 5, 16, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB1_65
+; AIX32-NEXT:  # %bb.66: # %entry
+; AIX32-NEXT:    srw 3, 4, 18
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(25)
+; AIX32-NEXT:    ori 3, 4, 65535
+; AIX32-NEXT:    slw 3, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_67: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    and 5, 29, 4
+; AIX32-NEXT:    andc 6, 4, 3
+; AIX32-NEXT:    and 5, 5, 3
+; AIX32-NEXT:    or 5, 5, 6
+; AIX32-NEXT:    stwcx. 5, 0, 13
+; AIX32-NEXT:    bne 0, L..BB1_67
+; AIX32-NEXT:  # %bb.68: # %entry
+; AIX32-NEXT:    srw 3, 4, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_69: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 3, 0, 28
+; AIX32-NEXT:    and 4, 8, 3
+; AIX32-NEXT:    stwcx. 4, 0, 28
+; AIX32-NEXT:    bne 0, L..BB1_69
+; AIX32-NEXT:  # %bb.70: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 3, 0(28)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB1_71: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 14
+; AIX32-NEXT:    and 3, 8, 7
+; AIX32-NEXT:    stwcx. 3, 0, 14
+; AIX32-NEXT:    bne 0, L..BB1_71
+; AIX32-NEXT:  # %bb.72: # %entry
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 7, 0(14)
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 11
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    lwz 31, 140(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 30, 136(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 29, 132(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 128(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 27, 124(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 26, 120(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 25, 116(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 24, 112(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 23, 108(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 22, 104(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 21, 100(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 20, 96(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 19, 92(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 18, 88(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 17, 84(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 16, 80(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 15, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 14, 72(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 13, 68(1) # 4-byte Folded Reload
+; AIX32-NEXT:    addi 1, 1, 144
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw add ptr @sc, i8 11 seq_cst, align 1
+  store i8 %0, ptr @sc, align 1
+  %1 = atomicrmw add ptr @uc, i8 11 seq_cst, align 1
+  store i8 %1, ptr @uc, align 1
+  %2 = atomicrmw add ptr @ss, i16 11 seq_cst, align 2
+  store i16 %2, ptr @ss, align 2
+  %3 = atomicrmw add ptr @us, i16 11 seq_cst, align 2
+  store i16 %3, ptr @us, align 2
+  %4 = atomicrmw add ptr @si, i32 11 seq_cst, align 4
+  store i32 %4, ptr @si, align 4
+  %5 = atomicrmw add ptr @ui, i32 11 seq_cst, align 4
+  store i32 %5, ptr @ui, align 4
+  %6 = atomicrmw add ptr @sll, i64 11 seq_cst, align 8
+  store i64 %6, ptr @sll, align 8
+  %7 = atomicrmw add ptr @ull, i64 11 seq_cst, align 8
+  store i64 %7, ptr @ull, align 8
+  %8 = atomicrmw sub ptr @sc, i8 11 seq_cst, align 1
+  store i8 %8, ptr @sc, align 1
+  %9 = atomicrmw sub ptr @uc, i8 11 seq_cst, align 1
+  store i8 %9, ptr @uc, align 1
+  %10 = atomicrmw sub ptr @ss, i16 11 seq_cst, align 2
+  store i16 %10, ptr @ss, align 2
+  %11 = atomicrmw sub ptr @us, i16 11 seq_cst, align 2
+  store i16 %11, ptr @us, align 2
+  %12 = atomicrmw sub ptr @si, i32 11 seq_cst, align 4
+  store i32 %12, ptr @si, align 4
+  %13 = atomicrmw sub ptr @ui, i32 11 seq_cst, align 4
+  store i32 %13, ptr @ui, align 4
+  %14 = atomicrmw sub ptr @sll, i64 11 seq_cst, align 8
+  store i64 %14, ptr @sll, align 8
+  %15 = atomicrmw sub ptr @ull, i64 11 seq_cst, align 8
+  store i64 %15, ptr @ull, align 8
+  %16 = atomicrmw or ptr @sc, i8 11 seq_cst, align 1
+  store i8 %16, ptr @sc, align 1
+  %17 = atomicrmw or ptr @uc, i8 11 seq_cst, align 1
+  store i8 %17, ptr @uc, align 1
+  %18 = atomicrmw or ptr @ss, i16 11 seq_cst, align 2
+  store i16 %18, ptr @ss, align 2
+  %19 = atomicrmw or ptr @us, i16 11 seq_cst, align 2
+  store i16 %19, ptr @us, align 2
+  %20 = atomicrmw or ptr @si, i32 11 seq_cst, align 4
+  store i32 %20, ptr @si, align 4
+  %21 = atomicrmw or ptr @ui, i32 11 seq_cst, align 4
+  store i32 %21, ptr @ui, align 4
+  %22 = atomicrmw or ptr @sll, i64 11 seq_cst, align 8
+  store i64 %22, ptr @sll, align 8
+  %23 = atomicrmw or ptr @ull, i64 11 seq_cst, align 8
+  store i64 %23, ptr @ull, align 8
+  %24 = atomicrmw xor ptr @sc, i8 11 seq_cst, align 1
+  store i8 %24, ptr @sc, align 1
+  %25 = atomicrmw xor ptr @uc, i8 11 seq_cst, align 1
+  store i8 %25, ptr @uc, align 1
+  %26 = atomicrmw xor ptr @ss, i16 11 seq_cst, align 2
+  store i16 %26, ptr @ss, align 2
+  %27 = atomicrmw xor ptr @us, i16 11 seq_cst, align 2
+  store i16 %27, ptr @us, align 2
+  %28 = atomicrmw xor ptr @si, i32 11 seq_cst, align 4
+  store i32 %28, ptr @si, align 4
+  %29 = atomicrmw xor ptr @ui, i32 11 seq_cst, align 4
+  store i32 %29, ptr @ui, align 4
+  %30 = atomicrmw xor ptr @sll, i64 11 seq_cst, align 8
+  store i64 %30, ptr @sll, align 8
+  %31 = atomicrmw xor ptr @ull, i64 11 seq_cst, align 8
+  store i64 %31, ptr @ull, align 8
+  %32 = atomicrmw nand ptr @sc, i8 11 seq_cst, align 1
+  store i8 %32, ptr @sc, align 1
+  %33 = atomicrmw nand ptr @uc, i8 11 seq_cst, align 1
+  store i8 %33, ptr @uc, align 1
+  %34 = atomicrmw nand ptr @ss, i16 11 seq_cst, align 2
+  store i16 %34, ptr @ss, align 2
+  %35 = atomicrmw nand ptr @us, i16 11 seq_cst, align 2
+  store i16 %35, ptr @us, align 2
+  %36 = atomicrmw nand ptr @si, i32 11 seq_cst, align 4
+  store i32 %36, ptr @si, align 4
+  %37 = atomicrmw nand ptr @ui, i32 11 seq_cst, align 4
+  store i32 %37, ptr @ui, align 4
+  %38 = atomicrmw nand ptr @sll, i64 11 seq_cst, align 8
+  store i64 %38, ptr @sll, align 8
+  %39 = atomicrmw nand ptr @ull, i64 11 seq_cst, align 8
+  store i64 %39, ptr @ull, align 8
+  %40 = atomicrmw and ptr @sc, i8 11 seq_cst, align 1
+  store i8 %40, ptr @sc, align 1
+  %41 = atomicrmw and ptr @uc, i8 11 seq_cst, align 1
+  store i8 %41, ptr @uc, align 1
+  %42 = atomicrmw and ptr @ss, i16 11 seq_cst, align 2
+  store i16 %42, ptr @ss, align 2
+  %43 = atomicrmw and ptr @us, i16 11 seq_cst, align 2
+  store i16 %43, ptr @us, align 2
+  %44 = atomicrmw and ptr @si, i32 11 seq_cst, align 4
+  store i32 %44, ptr @si, align 4
+  %45 = atomicrmw and ptr @ui, i32 11 seq_cst, align 4
+  store i32 %45, ptr @ui, align 4
+  %46 = atomicrmw and ptr @sll, i64 11 seq_cst, align 8
+  store i64 %46, ptr @sll, align 8
+  %47 = atomicrmw and ptr @ull, i64 11 seq_cst, align 8
+  store i64 %47, ptr @ull, align 8
+  ret void
+}
+
+define dso_local void @test_op_and_fetch() local_unnamed_addr #0 {
+; CHECK-LABEL: test_op_and_fetch:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 3, 2, uc at toc@ha
+; CHECK-NEXT:    addis 5, 2, sc at toc@ha
+; CHECK-NEXT:    std 16, -128(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 17, -120(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 18, -112(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 19, -104(1) # 8-byte Folded Spill
+; CHECK-NEXT:    addi 4, 3, uc at toc@l
+; CHECK-NEXT:    addi 7, 5, sc at toc@l
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    std 20, -96(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 21, -88(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 22, -80(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 23, -72(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 24, -64(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 25, -56(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 26, -48(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 27, -40(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 28, -32(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 29, -24(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 30, -16(1) # 8-byte Folded Spill
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 8, 0, 7
+; CHECK-NEXT:    add 8, 6, 8
+; CHECK-NEXT:    stbcx. 8, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_1
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 8, sc at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_3: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 8, 0, 4
+; CHECK-NEXT:    add 8, 6, 8
+; CHECK-NEXT:    stbcx. 8, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_3
+; CHECK-NEXT:  # %bb.4: # %entry
+; CHECK-NEXT:    addis 6, 2, ss at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 8, uc at toc@l(3)
+; CHECK-NEXT:    clrlwi 8, 8, 24
+; CHECK-NEXT:    addi 9, 6, ss at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 10, 0, 9
+; CHECK-NEXT:    add 10, 8, 10
+; CHECK-NEXT:    sthcx. 10, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_5
+; CHECK-NEXT:  # %bb.6: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 10, ss at toc@l(6)
+; CHECK-NEXT:    addis 8, 2, us at toc@ha
+; CHECK-NEXT:    lbz 10, uc at toc@l(3)
+; CHECK-NEXT:    addi 11, 8, us at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_7: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 12, 0, 11
+; CHECK-NEXT:    add 12, 10, 12
+; CHECK-NEXT:    sthcx. 12, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_7
+; CHECK-NEXT:  # %bb.8: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 12, us at toc@l(8)
+; CHECK-NEXT:    addis 10, 2, si at toc@ha
+; CHECK-NEXT:    lbz 12, uc at toc@l(3)
+; CHECK-NEXT:    addi 0, 10, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_9: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 30, 0, 0
+; CHECK-NEXT:    add 30, 12, 30
+; CHECK-NEXT:    stwcx. 30, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_9
+; CHECK-NEXT:  # %bb.10: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 30, si at toc@l(10)
+; CHECK-NEXT:    addis 12, 2, ui at toc@ha
+; CHECK-NEXT:    lbz 30, uc at toc@l(3)
+; CHECK-NEXT:    addi 29, 12, ui at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_11: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 28, 0, 29
+; CHECK-NEXT:    add 28, 30, 28
+; CHECK-NEXT:    stwcx. 28, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_11
+; CHECK-NEXT:  # %bb.12: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 28, ui at toc@l(12)
+; CHECK-NEXT:    addis 30, 2, sll at toc@ha
+; CHECK-NEXT:    lbz 28, uc at toc@l(3)
+; CHECK-NEXT:    addi 27, 30, sll at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_13: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 26, 0, 27
+; CHECK-NEXT:    add 26, 28, 26
+; CHECK-NEXT:    stdcx. 26, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_13
+; CHECK-NEXT:  # %bb.14: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addis 28, 2, ull at toc@ha
+; CHECK-NEXT:    std 26, sll at toc@l(30)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    addi 26, 28, ull at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_15: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 26
+; CHECK-NEXT:    add 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_15
+; CHECK-NEXT:  # %bb.16: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, ull at toc@l(28)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_17: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 7
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stbcx. 24, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_17
+; CHECK-NEXT:  # %bb.18: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, sc at toc@l(5)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_19: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 4
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stbcx. 24, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_19
+; CHECK-NEXT:  # %bb.20: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, uc at toc@l(3)
+; CHECK-NEXT:    clrlwi 25, 24, 24
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_21: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 9
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    sthcx. 24, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_21
+; CHECK-NEXT:  # %bb.22: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, ss at toc@l(6)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_23: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 11
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    sthcx. 24, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_23
+; CHECK-NEXT:  # %bb.24: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, us at toc@l(8)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_25: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 0
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stwcx. 24, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_25
+; CHECK-NEXT:  # %bb.26: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, si at toc@l(10)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_27: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 29
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stwcx. 24, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_27
+; CHECK-NEXT:  # %bb.28: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, ui at toc@l(12)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_29: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 27
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stdcx. 24, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_29
+; CHECK-NEXT:  # %bb.30: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, sll at toc@l(30)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_31: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 26
+; CHECK-NEXT:    sub 24, 24, 25
+; CHECK-NEXT:    stdcx. 24, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_31
+; CHECK-NEXT:  # %bb.32: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, ull at toc@l(28)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_33: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 7
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_33
+; CHECK-NEXT:  # %bb.34: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, sc at toc@l(5)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_35: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 4
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_35
+; CHECK-NEXT:  # %bb.36: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, uc at toc@l(3)
+; CHECK-NEXT:    clrlwi 25, 24, 24
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_37: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 9
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_37
+; CHECK-NEXT:  # %bb.38: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, ss at toc@l(6)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_39: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 11
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_39
+; CHECK-NEXT:  # %bb.40: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, us at toc@l(8)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_41: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 0
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_41
+; CHECK-NEXT:  # %bb.42: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, si at toc@l(10)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_43: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 29
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_43
+; CHECK-NEXT:  # %bb.44: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, ui at toc@l(12)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_45: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 27
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_45
+; CHECK-NEXT:  # %bb.46: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, sll at toc@l(30)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_47: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 26
+; CHECK-NEXT:    or 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_47
+; CHECK-NEXT:  # %bb.48: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, ull at toc@l(28)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_49: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 7
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_49
+; CHECK-NEXT:  # %bb.50: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, sc at toc@l(5)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_51: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 4
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_51
+; CHECK-NEXT:  # %bb.52: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, uc at toc@l(3)
+; CHECK-NEXT:    clrlwi 25, 24, 24
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_53: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 9
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_53
+; CHECK-NEXT:  # %bb.54: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, ss at toc@l(6)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_55: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 11
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_55
+; CHECK-NEXT:  # %bb.56: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, us at toc@l(8)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_57: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 0
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_57
+; CHECK-NEXT:  # %bb.58: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, si at toc@l(10)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_59: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 29
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_59
+; CHECK-NEXT:  # %bb.60: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, ui at toc@l(12)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_61: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 27
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_61
+; CHECK-NEXT:  # %bb.62: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, sll at toc@l(30)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_63: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 26
+; CHECK-NEXT:    xor 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_63
+; CHECK-NEXT:  # %bb.64: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, ull at toc@l(28)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_65: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 7
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_65
+; CHECK-NEXT:  # %bb.66: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, sc at toc@l(5)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_67: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 4
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_67
+; CHECK-NEXT:  # %bb.68: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, uc at toc@l(3)
+; CHECK-NEXT:    clrlwi 25, 24, 24
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_69: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 9
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_69
+; CHECK-NEXT:  # %bb.70: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, ss at toc@l(6)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_71: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 24, 0, 11
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    sthcx. 24, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_71
+; CHECK-NEXT:  # %bb.72: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 24, us at toc@l(8)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_73: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 0
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_73
+; CHECK-NEXT:  # %bb.74: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, si at toc@l(10)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_75: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 24, 0, 29
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stwcx. 24, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_75
+; CHECK-NEXT:  # %bb.76: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 24, ui at toc@l(12)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_77: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 27
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_77
+; CHECK-NEXT:  # %bb.78: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, sll at toc@l(30)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_79: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 24, 0, 26
+; CHECK-NEXT:    nand 24, 25, 24
+; CHECK-NEXT:    stdcx. 24, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_79
+; CHECK-NEXT:  # %bb.80: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 24, ull at toc@l(28)
+; CHECK-NEXT:    addis 24, 2, u128 at toc@ha
+; CHECK-NEXT:    li 22, 0
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    addi 23, 24, u128 at toc@l
+; CHECK-NEXT:  .LBB2_81: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lqarx 20, 0, 23
+; CHECK-NEXT:    nand 19, 25, 21
+; CHECK-NEXT:    nand 18, 22, 20
+; CHECK-NEXT:    stqcx. 18, 0, 23
+; CHECK-NEXT:    bne 0, .LBB2_81
+; CHECK-NEXT:  # %bb.82: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    nand 25, 21, 25
+; CHECK-NEXT:    li 21, -1
+; CHECK-NEXT:    lbz 20, uc at toc@l(3)
+; CHECK-NEXT:    std 21, 8(23)
+; CHECK-NEXT:    std 25, u128 at toc@l(24)
+; CHECK-NEXT:    addis 25, 2, s128 at toc@ha
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    addi 24, 25, s128 at toc@l
+; CHECK-NEXT:  .LBB2_83: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lqarx 18, 0, 24
+; CHECK-NEXT:    nand 17, 20, 19
+; CHECK-NEXT:    nand 16, 22, 18
+; CHECK-NEXT:    stqcx. 16, 0, 24
+; CHECK-NEXT:    bne 0, .LBB2_83
+; CHECK-NEXT:  # %bb.84: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 21, 8(24)
+; CHECK-NEXT:    nand 23, 19, 20
+; CHECK-NEXT:    std 23, s128 at toc@l(25)
+; CHECK-NEXT:    lbz 25, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_85: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 24, 0, 7
+; CHECK-NEXT:    and 24, 25, 24
+; CHECK-NEXT:    stbcx. 24, 0, 7
+; CHECK-NEXT:    bne 0, .LBB2_85
+; CHECK-NEXT:  # %bb.86: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 24, sc at toc@l(5)
+; CHECK-NEXT:    lbz 7, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_87: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 4
+; CHECK-NEXT:    and 5, 7, 5
+; CHECK-NEXT:    stbcx. 5, 0, 4
+; CHECK-NEXT:    bne 0, .LBB2_87
+; CHECK-NEXT:  # %bb.88: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 5, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_89: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 4, 0, 9
+; CHECK-NEXT:    and 4, 5, 4
+; CHECK-NEXT:    sthcx. 4, 0, 9
+; CHECK-NEXT:    bne 0, .LBB2_89
+; CHECK-NEXT:  # %bb.90: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 4, ss at toc@l(6)
+; CHECK-NEXT:    lbz 4, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_91: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 5, 0, 11
+; CHECK-NEXT:    and 5, 4, 5
+; CHECK-NEXT:    sthcx. 5, 0, 11
+; CHECK-NEXT:    bne 0, .LBB2_91
+; CHECK-NEXT:  # %bb.92: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 5, us at toc@l(8)
+; CHECK-NEXT:    lbz 4, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_93: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 5, 0, 0
+; CHECK-NEXT:    and 5, 4, 5
+; CHECK-NEXT:    stwcx. 5, 0, 0
+; CHECK-NEXT:    bne 0, .LBB2_93
+; CHECK-NEXT:  # %bb.94: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 5, si at toc@l(10)
+; CHECK-NEXT:    lbz 4, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_95: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 5, 0, 29
+; CHECK-NEXT:    and 5, 4, 5
+; CHECK-NEXT:    stwcx. 5, 0, 29
+; CHECK-NEXT:    bne 0, .LBB2_95
+; CHECK-NEXT:  # %bb.96: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 5, ui at toc@l(12)
+; CHECK-NEXT:    lbz 4, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_97: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 5, 0, 27
+; CHECK-NEXT:    and 5, 4, 5
+; CHECK-NEXT:    stdcx. 5, 0, 27
+; CHECK-NEXT:    bne 0, .LBB2_97
+; CHECK-NEXT:  # %bb.98: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 5, sll at toc@l(30)
+; CHECK-NEXT:    lbz 3, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB2_99: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 4, 0, 26
+; CHECK-NEXT:    and 4, 3, 4
+; CHECK-NEXT:    stdcx. 4, 0, 26
+; CHECK-NEXT:    bne 0, .LBB2_99
+; CHECK-NEXT:  # %bb.100: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 4, ull at toc@l(28)
+; CHECK-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 29, -24(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 28, -32(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 27, -40(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 26, -48(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 25, -56(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 24, -64(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 23, -72(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 22, -80(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 21, -88(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 20, -96(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 19, -104(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 18, -112(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 17, -120(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 16, -128(1) # 8-byte Folded Reload
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_op_and_fetch:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -176(1)
+; AIX32-NEXT:    stw 24, 144(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 26, 152(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lwz 26, L..C1(2) # @uc
+; AIX32-NEXT:    lwz 24, L..C0(2) # @sc
+; AIX32-NEXT:    stw 23, 140(1) # 4-byte Folded Spill
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 13, 100(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 14, 104(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    rlwinm 4, 24, 3, 27, 28
+; AIX32-NEXT:    stw 15, 108(1) # 4-byte Folded Spill
+; AIX32-NEXT:    xori 23, 4, 24
+; AIX32-NEXT:    stw 16, 112(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 17, 116(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 18, 120(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 19, 124(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 20, 128(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 21, 132(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 22, 136(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 25, 148(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 27, 156(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 28, 160(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 29, 164(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 30, 168(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 172(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 22, 24, 0, 0, 29
+; AIX32-NEXT:    li 25, -1
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 4, 3, 23
+; AIX32-NEXT:    slw 6, 5, 23
+; AIX32-NEXT:  L..BB2_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 22
+; AIX32-NEXT:    add 7, 4, 5
+; AIX32-NEXT:    andc 8, 5, 6
+; AIX32-NEXT:    and 7, 7, 6
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_1
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    srw 4, 5, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    rlwinm 5, 26, 3, 27, 28
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    xori 21, 5, 24
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    add 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    rlwinm 19, 26, 0, 0, 29
+; AIX32-NEXT:    stb 4, 0(24)
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_3: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    add 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_3
+; AIX32-NEXT:  # %bb.4: # %entry
+; AIX32-NEXT:    lwz 9, L..C2(2) # @ss
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    add 3, 4, 3
+; AIX32-NEXT:    rlwinm 4, 9, 3, 27, 27
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    xori 18, 4, 16
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 17, 9, 0, 0, 29
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:  L..BB2_5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    add 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_5
+; AIX32-NEXT:  # %bb.6: # %entry
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwz 20, L..C3(2) # @us
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    add 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(9)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    rlwinm 4, 20, 3, 27, 27
+; AIX32-NEXT:    xori 15, 4, 16
+; AIX32-NEXT:    rlwinm 14, 20, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:  L..BB2_7: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    add 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_7
+; AIX32-NEXT:  # %bb.8: # %entry
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    lwz 13, L..C4(2) # @si
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    add 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_9: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    add 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_9
+; AIX32-NEXT:  # %bb.10: # %entry
+; AIX32-NEXT:    stw 9, 60(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lwz 16, L..C5(2) # @ui
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_11: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    add 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_11
+; AIX32-NEXT:  # %bb.12: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    stw 4, 0(16)
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    li 27, 0
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    addc 7, 4, 29
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    addze 8, 3
+; AIX32-NEXT:    stw 7, 4(31)
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 8, 0(31)
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    bl .__atomic_fetch_add_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 5, 0(26)
+; AIX32-NEXT:    addc 4, 4, 28
+; AIX32-NEXT:    addze 3, 3
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    li 4, 255
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 23
+; AIX32-NEXT:    slw 4, 4, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_13: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 22
+; AIX32-NEXT:    sub 7, 6, 3
+; AIX32-NEXT:    andc 8, 6, 4
+; AIX32-NEXT:    and 7, 7, 4
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_13
+; AIX32-NEXT:  # %bb.14: # %entry
+; AIX32-NEXT:    srw 3, 6, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    sub 4, 3, 5
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stb 4, 0(24)
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_15: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    sub 7, 6, 4
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_15
+; AIX32-NEXT:  # %bb.16: # %entry
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    sub 3, 4, 3
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    ori 5, 4, 65535
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_17: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    sub 7, 6, 4
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_17
+; AIX32-NEXT:  # %bb.18: # %entry
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    lwz 6, 60(1) # 4-byte Folded Reload
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    sub 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:    sth 4, 0(6)
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_19: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    sub 7, 6, 4
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_19
+; AIX32-NEXT:  # %bb.20: # %entry
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    sub 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_21: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    sub 4, 4, 3
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_21
+; AIX32-NEXT:  # %bb.22: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_23: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    sub 7, 4, 3
+; AIX32-NEXT:    stwcx. 7, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_23
+; AIX32-NEXT:  # %bb.24: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    stw 7, 0(16)
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    subc 7, 4, 29
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    subfe 8, 27, 3
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 7, 4(31)
+; AIX32-NEXT:    stw 8, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_sub_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 5, 0(26)
+; AIX32-NEXT:    subc 4, 4, 28
+; AIX32-NEXT:    subfe 3, 27, 3
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    li 4, 255
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    slw 3, 5, 23
+; AIX32-NEXT:    slw 4, 4, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_25: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 22
+; AIX32-NEXT:    or 7, 3, 6
+; AIX32-NEXT:    andc 8, 6, 4
+; AIX32-NEXT:    and 7, 7, 4
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_25
+; AIX32-NEXT:  # %bb.26: # %entry
+; AIX32-NEXT:    srw 3, 6, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    or 4, 3, 5
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stb 4, 0(24)
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    lwz 27, 60(1) # 4-byte Folded Reload
+; AIX32-NEXT:  L..BB2_27: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    or 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_27
+; AIX32-NEXT:  # %bb.28: # %entry
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    or 3, 4, 3
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    ori 5, 4, 65535
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_29: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    or 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_29
+; AIX32-NEXT:  # %bb.30: # %entry
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    or 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:    sth 4, 0(27)
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_31: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    or 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_31
+; AIX32-NEXT:  # %bb.32: # %entry
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    or 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_33: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    or 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_33
+; AIX32-NEXT:  # %bb.34: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_35: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    or 7, 3, 4
+; AIX32-NEXT:    stwcx. 7, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_35
+; AIX32-NEXT:  # %bb.36: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    stw 7, 0(16)
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    or 8, 4, 29
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    bl .__atomic_fetch_or_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 5, 0(26)
+; AIX32-NEXT:    or 4, 4, 28
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    li 4, 255
+; AIX32-NEXT:    slw 3, 5, 23
+; AIX32-NEXT:    slw 4, 4, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_37: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 22
+; AIX32-NEXT:    xor 7, 3, 6
+; AIX32-NEXT:    andc 8, 6, 4
+; AIX32-NEXT:    and 7, 7, 4
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_37
+; AIX32-NEXT:  # %bb.38: # %entry
+; AIX32-NEXT:    srw 3, 6, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    xor 4, 3, 5
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stb 4, 0(24)
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_39: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    xor 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_39
+; AIX32-NEXT:  # %bb.40: # %entry
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    xor 3, 4, 3
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    ori 5, 4, 65535
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_41: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    xor 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_41
+; AIX32-NEXT:  # %bb.42: # %entry
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    xor 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:    sth 4, 0(27)
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_43: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    xor 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_43
+; AIX32-NEXT:  # %bb.44: # %entry
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    xor 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_45: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    xor 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_45
+; AIX32-NEXT:  # %bb.46: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_47: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    xor 7, 3, 4
+; AIX32-NEXT:    stwcx. 7, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_47
+; AIX32-NEXT:  # %bb.48: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    stw 7, 0(16)
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    xor 8, 4, 29
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    bl .__atomic_fetch_xor_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 5, 0(26)
+; AIX32-NEXT:    xor 4, 4, 28
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    li 4, 255
+; AIX32-NEXT:    slw 3, 5, 23
+; AIX32-NEXT:    slw 4, 4, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_49: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 22
+; AIX32-NEXT:    nand 7, 3, 6
+; AIX32-NEXT:    andc 8, 6, 4
+; AIX32-NEXT:    and 7, 7, 4
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_49
+; AIX32-NEXT:  # %bb.50: # %entry
+; AIX32-NEXT:    srw 3, 6, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    nand 4, 3, 5
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stb 4, 0(24)
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_51: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    nand 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_51
+; AIX32-NEXT:  # %bb.52: # %entry
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    nand 3, 4, 3
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    ori 5, 4, 65535
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_53: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    nand 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_53
+; AIX32-NEXT:  # %bb.54: # %entry
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    nand 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:    sth 4, 0(27)
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_55: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    nand 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_55
+; AIX32-NEXT:  # %bb.56: # %entry
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    nand 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_57: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    nand 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_57
+; AIX32-NEXT:  # %bb.58: # %entry
+; AIX32-NEXT:    stw 24, 56(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_59: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    nand 7, 3, 4
+; AIX32-NEXT:    stwcx. 7, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_59
+; AIX32-NEXT:  # %bb.60: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    stw 7, 0(16)
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    nand 7, 4, 29
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 7, 4(31)
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 25, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_nand_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 29, L..C8(2) # @u128
+; AIX32-NEXT:    nand 3, 4, 28
+; AIX32-NEXT:    lbz 24, 0(26)
+; AIX32-NEXT:    addi 28, 1, 80
+; AIX32-NEXT:    addi 27, 1, 64
+; AIX32-NEXT:    stw 3, 4(30)
+; AIX32-NEXT:    stw 25, 0(30)
+; AIX32-NEXT:    lwz 3, 12(29)
+; AIX32-NEXT:    lwz 4, 8(29)
+; AIX32-NEXT:    lwz 5, 4(29)
+; AIX32-NEXT:    lwz 6, 0(29)
+; AIX32-NEXT:    .align 4
+; AIX32-NEXT:  L..BB2_61: # %atomicrmw.start
+; AIX32-NEXT:    #
+; AIX32-NEXT:    and 7, 3, 24
+; AIX32-NEXT:    stw 3, 92(1)
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    xor 3, 7, 25
+; AIX32-NEXT:    stw 6, 80(1)
+; AIX32-NEXT:    mr 6, 27
+; AIX32-NEXT:    stw 5, 84(1)
+; AIX32-NEXT:    stw 4, 88(1)
+; AIX32-NEXT:    stw 3, 76(1)
+; AIX32-NEXT:    li 3, 16
+; AIX32-NEXT:    mr 4, 29
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    stw 25, 72(1)
+; AIX32-NEXT:    stw 25, 68(1)
+; AIX32-NEXT:    stw 25, 64(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    cmplwi 3, 0
+; AIX32-NEXT:    lwz 3, 92(1)
+; AIX32-NEXT:    lwz 4, 88(1)
+; AIX32-NEXT:    lwz 5, 84(1)
+; AIX32-NEXT:    lwz 6, 80(1)
+; AIX32-NEXT:    beq 0, L..BB2_61
+; AIX32-NEXT:  # %bb.62: # %atomicrmw.end
+; AIX32-NEXT:    lwz 28, L..C9(2) # @s128
+; AIX32-NEXT:    and 3, 3, 24
+; AIX32-NEXT:    lbz 24, 0(26)
+; AIX32-NEXT:    stw 25, 0(29)
+; AIX32-NEXT:    xor 3, 3, 25
+; AIX32-NEXT:    stw 25, 4(29)
+; AIX32-NEXT:    addi 27, 1, 64
+; AIX32-NEXT:    stw 3, 12(29)
+; AIX32-NEXT:    stw 25, 8(29)
+; AIX32-NEXT:    lwz 3, 12(28)
+; AIX32-NEXT:    lwz 4, 8(28)
+; AIX32-NEXT:    addi 29, 1, 80
+; AIX32-NEXT:    lwz 5, 4(28)
+; AIX32-NEXT:    lwz 6, 0(28)
+; AIX32-NEXT:    .align 4
+; AIX32-NEXT:  L..BB2_63: # %atomicrmw.start2
+; AIX32-NEXT:    #
+; AIX32-NEXT:    and 7, 3, 24
+; AIX32-NEXT:    stw 3, 92(1)
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    xor 3, 7, 25
+; AIX32-NEXT:    stw 6, 80(1)
+; AIX32-NEXT:    mr 6, 27
+; AIX32-NEXT:    stw 5, 84(1)
+; AIX32-NEXT:    stw 4, 88(1)
+; AIX32-NEXT:    stw 3, 76(1)
+; AIX32-NEXT:    li 3, 16
+; AIX32-NEXT:    mr 4, 28
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    stw 25, 72(1)
+; AIX32-NEXT:    stw 25, 68(1)
+; AIX32-NEXT:    stw 25, 64(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    cmplwi 3, 0
+; AIX32-NEXT:    lwz 3, 92(1)
+; AIX32-NEXT:    lwz 4, 88(1)
+; AIX32-NEXT:    lwz 5, 84(1)
+; AIX32-NEXT:    lwz 6, 80(1)
+; AIX32-NEXT:    beq 0, L..BB2_63
+; AIX32-NEXT:  # %bb.64: # %atomicrmw.end1
+; AIX32-NEXT:    and 3, 3, 24
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    xor 4, 3, 25
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    stw 25, 0(28)
+; AIX32-NEXT:    stw 25, 4(28)
+; AIX32-NEXT:    stw 25, 8(28)
+; AIX32-NEXT:    stw 4, 12(28)
+; AIX32-NEXT:    slw 4, 3, 23
+; AIX32-NEXT:    slw 5, 5, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_65: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 22
+; AIX32-NEXT:    and 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB2_65
+; AIX32-NEXT:  # %bb.66: # %atomicrmw.end1
+; AIX32-NEXT:    srw 4, 6, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    lwz 5, 56(1) # 4-byte Folded Reload
+; AIX32-NEXT:    and 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    stb 4, 0(5)
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 4, 3, 21
+; AIX32-NEXT:    slw 5, 5, 21
+; AIX32-NEXT:    lwz 9, 60(1) # 4-byte Folded Reload
+; AIX32-NEXT:  L..BB2_67: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 19
+; AIX32-NEXT:    and 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB2_67
+; AIX32-NEXT:  # %bb.68: # %atomicrmw.end1
+; AIX32-NEXT:    srw 4, 6, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    and 3, 4, 3
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    ori 5, 4, 65535
+; AIX32-NEXT:    stb 3, 0(26)
+; AIX32-NEXT:    slw 4, 3, 18
+; AIX32-NEXT:    slw 5, 5, 18
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_69: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 17
+; AIX32-NEXT:    and 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 17
+; AIX32-NEXT:    bne 0, L..BB2_69
+; AIX32-NEXT:  # %bb.70: # %atomicrmw.end1
+; AIX32-NEXT:    srw 4, 6, 18
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    and 4, 4, 3
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    slw 5, 5, 15
+; AIX32-NEXT:    sth 4, 0(9)
+; AIX32-NEXT:    slw 4, 3, 15
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_71: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 14
+; AIX32-NEXT:    and 7, 4, 6
+; AIX32-NEXT:    andc 8, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:    or 7, 7, 8
+; AIX32-NEXT:    stwcx. 7, 0, 14
+; AIX32-NEXT:    bne 0, L..BB2_71
+; AIX32-NEXT:  # %bb.72: # %atomicrmw.end1
+; AIX32-NEXT:    srw 4, 6, 15
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    and 3, 4, 3
+; AIX32-NEXT:    sth 3, 0(20)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_73: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 13
+; AIX32-NEXT:    and 4, 3, 4
+; AIX32-NEXT:    stwcx. 4, 0, 13
+; AIX32-NEXT:    bne 0, L..BB2_73
+; AIX32-NEXT:  # %bb.74: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(13)
+; AIX32-NEXT:    lbz 3, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB2_75: # %atomicrmw.end1
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 16
+; AIX32-NEXT:    and 7, 3, 4
+; AIX32-NEXT:    stwcx. 7, 0, 16
+; AIX32-NEXT:    bne 0, L..BB2_75
+; AIX32-NEXT:  # %bb.76: # %atomicrmw.end1
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    li 27, 0
+; AIX32-NEXT:    lbz 29, 0(26)
+; AIX32-NEXT:    stw 7, 0(16)
+; AIX32-NEXT:    mr 5, 29
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 28, 0(26)
+; AIX32-NEXT:    and 7, 4, 29
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 7, 4(31)
+; AIX32-NEXT:    mr 5, 28
+; AIX32-NEXT:    stw 27, 0(31)
+; AIX32-NEXT:    bl .__atomic_fetch_and_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    and 3, 4, 28
+; AIX32-NEXT:    stw 27, 0(30)
+; AIX32-NEXT:    lwz 31, 172(1) # 4-byte Folded Reload
+; AIX32-NEXT:    stw 3, 4(30)
+; AIX32-NEXT:    lwz 30, 168(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 29, 164(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 160(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 27, 156(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 26, 152(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 25, 148(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 24, 144(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 23, 140(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 22, 136(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 21, 132(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 20, 128(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 19, 124(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 18, 120(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 17, 116(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 16, 112(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 15, 108(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 14, 104(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 13, 100(1) # 4-byte Folded Reload
+; AIX32-NEXT:    addi 1, 1, 176
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = load i8, ptr @uc, align 1
+  %1 = atomicrmw add ptr @sc, i8 %0 seq_cst, align 1
+  %2 = add i8 %1, %0
+  store i8 %2, ptr @sc, align 1
+  %3 = load i8, ptr @uc, align 1
+  %4 = atomicrmw add ptr @uc, i8 %3 seq_cst, align 1
+  %5 = add i8 %4, %3
+  store i8 %5, ptr @uc, align 1
+  %conv = zext i8 %5 to i16
+  %6 = atomicrmw add ptr @ss, i16 %conv seq_cst, align 2
+  %7 = add i16 %6, %conv
+  store i16 %7, ptr @ss, align 2
+  %8 = load i8, ptr @uc, align 1
+  %conv1 = zext i8 %8 to i16
+  %9 = atomicrmw add ptr @us, i16 %conv1 seq_cst, align 2
+  %10 = add i16 %9, %conv1
+  store i16 %10, ptr @us, align 2
+  %11 = load i8, ptr @uc, align 1
+  %conv2 = zext i8 %11 to i32
+  %12 = atomicrmw add ptr @si, i32 %conv2 seq_cst, align 4
+  %13 = add i32 %12, %conv2
+  store i32 %13, ptr @si, align 4
+  %14 = load i8, ptr @uc, align 1
+  %conv3 = zext i8 %14 to i32
+  %15 = atomicrmw add ptr @ui, i32 %conv3 seq_cst, align 4
+  %16 = add i32 %15, %conv3
+  store i32 %16, ptr @ui, align 4
+  %17 = load i8, ptr @uc, align 1
+  %conv4 = zext i8 %17 to i64
+  %18 = atomicrmw add ptr @sll, i64 %conv4 seq_cst, align 8
+  %19 = add i64 %18, %conv4
+  store i64 %19, ptr @sll, align 8
+  %20 = load i8, ptr @uc, align 1
+  %conv5 = zext i8 %20 to i64
+  %21 = atomicrmw add ptr @ull, i64 %conv5 seq_cst, align 8
+  %22 = add i64 %21, %conv5
+  store i64 %22, ptr @ull, align 8
+  %23 = load i8, ptr @uc, align 1
+  %24 = atomicrmw sub ptr @sc, i8 %23 seq_cst, align 1
+  %25 = sub i8 %24, %23
+  store i8 %25, ptr @sc, align 1
+  %26 = load i8, ptr @uc, align 1
+  %27 = atomicrmw sub ptr @uc, i8 %26 seq_cst, align 1
+  %28 = sub i8 %27, %26
+  store i8 %28, ptr @uc, align 1
+  %conv6 = zext i8 %28 to i16
+  %29 = atomicrmw sub ptr @ss, i16 %conv6 seq_cst, align 2
+  %30 = sub i16 %29, %conv6
+  store i16 %30, ptr @ss, align 2
+  %31 = load i8, ptr @uc, align 1
+  %conv7 = zext i8 %31 to i16
+  %32 = atomicrmw sub ptr @us, i16 %conv7 seq_cst, align 2
+  %33 = sub i16 %32, %conv7
+  store i16 %33, ptr @us, align 2
+  %34 = load i8, ptr @uc, align 1
+  %conv8 = zext i8 %34 to i32
+  %35 = atomicrmw sub ptr @si, i32 %conv8 seq_cst, align 4
+  %36 = sub i32 %35, %conv8
+  store i32 %36, ptr @si, align 4
+  %37 = load i8, ptr @uc, align 1
+  %conv9 = zext i8 %37 to i32
+  %38 = atomicrmw sub ptr @ui, i32 %conv9 seq_cst, align 4
+  %39 = sub i32 %38, %conv9
+  store i32 %39, ptr @ui, align 4
+  %40 = load i8, ptr @uc, align 1
+  %conv10 = zext i8 %40 to i64
+  %41 = atomicrmw sub ptr @sll, i64 %conv10 seq_cst, align 8
+  %42 = sub i64 %41, %conv10
+  store i64 %42, ptr @sll, align 8
+  %43 = load i8, ptr @uc, align 1
+  %conv11 = zext i8 %43 to i64
+  %44 = atomicrmw sub ptr @ull, i64 %conv11 seq_cst, align 8
+  %45 = sub i64 %44, %conv11
+  store i64 %45, ptr @ull, align 8
+  %46 = load i8, ptr @uc, align 1
+  %47 = atomicrmw or ptr @sc, i8 %46 seq_cst, align 1
+  %48 = or i8 %47, %46
+  store i8 %48, ptr @sc, align 1
+  %49 = load i8, ptr @uc, align 1
+  %50 = atomicrmw or ptr @uc, i8 %49 seq_cst, align 1
+  %51 = or i8 %50, %49
+  store i8 %51, ptr @uc, align 1
+  %conv12 = zext i8 %51 to i16
+  %52 = atomicrmw or ptr @ss, i16 %conv12 seq_cst, align 2
+  %53 = or i16 %52, %conv12
+  store i16 %53, ptr @ss, align 2
+  %54 = load i8, ptr @uc, align 1
+  %conv13 = zext i8 %54 to i16
+  %55 = atomicrmw or ptr @us, i16 %conv13 seq_cst, align 2
+  %56 = or i16 %55, %conv13
+  store i16 %56, ptr @us, align 2
+  %57 = load i8, ptr @uc, align 1
+  %conv14 = zext i8 %57 to i32
+  %58 = atomicrmw or ptr @si, i32 %conv14 seq_cst, align 4
+  %59 = or i32 %58, %conv14
+  store i32 %59, ptr @si, align 4
+  %60 = load i8, ptr @uc, align 1
+  %conv15 = zext i8 %60 to i32
+  %61 = atomicrmw or ptr @ui, i32 %conv15 seq_cst, align 4
+  %62 = or i32 %61, %conv15
+  store i32 %62, ptr @ui, align 4
+  %63 = load i8, ptr @uc, align 1
+  %conv16 = zext i8 %63 to i64
+  %64 = atomicrmw or ptr @sll, i64 %conv16 seq_cst, align 8
+  %65 = or i64 %64, %conv16
+  store i64 %65, ptr @sll, align 8
+  %66 = load i8, ptr @uc, align 1
+  %conv17 = zext i8 %66 to i64
+  %67 = atomicrmw or ptr @ull, i64 %conv17 seq_cst, align 8
+  %68 = or i64 %67, %conv17
+  store i64 %68, ptr @ull, align 8
+  %69 = load i8, ptr @uc, align 1
+  %70 = atomicrmw xor ptr @sc, i8 %69 seq_cst, align 1
+  %71 = xor i8 %70, %69
+  store i8 %71, ptr @sc, align 1
+  %72 = load i8, ptr @uc, align 1
+  %73 = atomicrmw xor ptr @uc, i8 %72 seq_cst, align 1
+  %74 = xor i8 %73, %72
+  store i8 %74, ptr @uc, align 1
+  %conv18 = zext i8 %74 to i16
+  %75 = atomicrmw xor ptr @ss, i16 %conv18 seq_cst, align 2
+  %76 = xor i16 %75, %conv18
+  store i16 %76, ptr @ss, align 2
+  %77 = load i8, ptr @uc, align 1
+  %conv19 = zext i8 %77 to i16
+  %78 = atomicrmw xor ptr @us, i16 %conv19 seq_cst, align 2
+  %79 = xor i16 %78, %conv19
+  store i16 %79, ptr @us, align 2
+  %80 = load i8, ptr @uc, align 1
+  %conv20 = zext i8 %80 to i32
+  %81 = atomicrmw xor ptr @si, i32 %conv20 seq_cst, align 4
+  %82 = xor i32 %81, %conv20
+  store i32 %82, ptr @si, align 4
+  %83 = load i8, ptr @uc, align 1
+  %conv21 = zext i8 %83 to i32
+  %84 = atomicrmw xor ptr @ui, i32 %conv21 seq_cst, align 4
+  %85 = xor i32 %84, %conv21
+  store i32 %85, ptr @ui, align 4
+  %86 = load i8, ptr @uc, align 1
+  %conv22 = zext i8 %86 to i64
+  %87 = atomicrmw xor ptr @sll, i64 %conv22 seq_cst, align 8
+  %88 = xor i64 %87, %conv22
+  store i64 %88, ptr @sll, align 8
+  %89 = load i8, ptr @uc, align 1
+  %conv23 = zext i8 %89 to i64
+  %90 = atomicrmw xor ptr @ull, i64 %conv23 seq_cst, align 8
+  %91 = xor i64 %90, %conv23
+  store i64 %91, ptr @ull, align 8
+  %92 = load i8, ptr @uc, align 1
+  %93 = atomicrmw nand ptr @sc, i8 %92 seq_cst, align 1
+  %94 = and i8 %93, %92
+  %95 = xor i8 %94, -1
+  store i8 %95, ptr @sc, align 1
+  %96 = load i8, ptr @uc, align 1
+  %97 = atomicrmw nand ptr @uc, i8 %96 seq_cst, align 1
+  %98 = and i8 %97, %96
+  %99 = xor i8 %98, -1
+  store i8 %99, ptr @uc, align 1
+  %conv24 = zext i8 %99 to i16
+  %100 = atomicrmw nand ptr @ss, i16 %conv24 seq_cst, align 2
+  %101 = and i16 %100, %conv24
+  %102 = xor i16 %101, -1
+  store i16 %102, ptr @ss, align 2
+  %103 = load i8, ptr @uc, align 1
+  %conv25 = zext i8 %103 to i16
+  %104 = atomicrmw nand ptr @us, i16 %conv25 seq_cst, align 2
+  %105 = and i16 %104, %conv25
+  %106 = xor i16 %105, -1
+  store i16 %106, ptr @us, align 2
+  %107 = load i8, ptr @uc, align 1
+  %conv26 = zext i8 %107 to i32
+  %108 = atomicrmw nand ptr @si, i32 %conv26 seq_cst, align 4
+  %109 = and i32 %108, %conv26
+  %110 = xor i32 %109, -1
+  store i32 %110, ptr @si, align 4
+  %111 = load i8, ptr @uc, align 1
+  %conv27 = zext i8 %111 to i32
+  %112 = atomicrmw nand ptr @ui, i32 %conv27 seq_cst, align 4
+  %113 = and i32 %112, %conv27
+  %114 = xor i32 %113, -1
+  store i32 %114, ptr @ui, align 4
+  %115 = load i8, ptr @uc, align 1
+  %conv28 = zext i8 %115 to i64
+  %116 = atomicrmw nand ptr @sll, i64 %conv28 seq_cst, align 8
+  %117 = and i64 %116, %conv28
+  %118 = xor i64 %117, -1
+  store i64 %118, ptr @sll, align 8
+  %119 = load i8, ptr @uc, align 1
+  %conv29 = zext i8 %119 to i64
+  %120 = atomicrmw nand ptr @ull, i64 %conv29 seq_cst, align 8
+  %121 = and i64 %120, %conv29
+  %122 = xor i64 %121, -1
+  store i64 %122, ptr @ull, align 8
+  %123 = load i8, ptr @uc, align 1
+  %conv30 = zext i8 %123 to i128
+  %124 = atomicrmw nand ptr @u128, i128 %conv30 seq_cst, align 16
+  %125 = and i128 %124, %conv30
+  %126 = xor i128 %125, -1
+  store i128 %126, ptr @u128, align 16
+  %127 = load i8, ptr @uc, align 1
+  %conv31 = zext i8 %127 to i128
+  %128 = atomicrmw nand ptr @s128, i128 %conv31 seq_cst, align 16
+  %129 = and i128 %128, %conv31
+  %130 = xor i128 %129, -1
+  store i128 %130, ptr @s128, align 16
+  %131 = load i8, ptr @uc, align 1
+  %132 = atomicrmw and ptr @sc, i8 %131 seq_cst, align 1
+  %133 = and i8 %132, %131
+  store i8 %133, ptr @sc, align 1
+  %134 = load i8, ptr @uc, align 1
+  %135 = atomicrmw and ptr @uc, i8 %134 seq_cst, align 1
+  %136 = and i8 %135, %134
+  store i8 %136, ptr @uc, align 1
+  %conv32 = zext i8 %136 to i16
+  %137 = atomicrmw and ptr @ss, i16 %conv32 seq_cst, align 2
+  %138 = and i16 %137, %conv32
+  store i16 %138, ptr @ss, align 2
+  %139 = load i8, ptr @uc, align 1
+  %conv33 = zext i8 %139 to i16
+  %140 = atomicrmw and ptr @us, i16 %conv33 seq_cst, align 2
+  %141 = and i16 %140, %conv33
+  store i16 %141, ptr @us, align 2
+  %142 = load i8, ptr @uc, align 1
+  %conv34 = zext i8 %142 to i32
+  %143 = atomicrmw and ptr @si, i32 %conv34 seq_cst, align 4
+  %144 = and i32 %143, %conv34
+  store i32 %144, ptr @si, align 4
+  %145 = load i8, ptr @uc, align 1
+  %conv35 = zext i8 %145 to i32
+  %146 = atomicrmw and ptr @ui, i32 %conv35 seq_cst, align 4
+  %147 = and i32 %146, %conv35
+  store i32 %147, ptr @ui, align 4
+  %148 = load i8, ptr @uc, align 1
+  %conv36 = zext i8 %148 to i64
+  %149 = atomicrmw and ptr @sll, i64 %conv36 seq_cst, align 8
+  %150 = and i64 %149, %conv36
+  store i64 %150, ptr @sll, align 8
+  %151 = load i8, ptr @uc, align 1
+  %conv37 = zext i8 %151 to i64
+  %152 = atomicrmw and ptr @ull, i64 %conv37 seq_cst, align 8
+  %153 = and i64 %152, %conv37
+  store i64 %153, ptr @ull, align 8
+  ret void
+}
+
+define dso_local void @test_compare_and_swap() local_unnamed_addr #0 {
+; CHECK-LABEL: test_compare_and_swap:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 3, 2, uc at toc@ha
+; CHECK-NEXT:    addis 4, 2, sc at toc@ha
+; CHECK-NEXT:    std 27, -40(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 28, -32(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 29, -24(1) # 8-byte Folded Spill
+; CHECK-NEXT:    std 30, -16(1) # 8-byte Folded Spill
+; CHECK-NEXT:    addi 6, 3, uc at toc@l
+; CHECK-NEXT:    addi 0, 4, sc at toc@l
+; CHECK-NEXT:    lbz 5, uc at toc@l(3)
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 7, 0, 0
+; CHECK-NEXT:    cmpw 5, 7
+; CHECK-NEXT:    bne 0, .LBB3_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stbcx. 8, 0, 0
+; CHECK-NEXT:    bne 0, .LBB3_1
+; CHECK-NEXT:    b .LBB3_4
+; CHECK-NEXT:  .LBB3_3: # %entry
+; CHECK-NEXT:    stbcx. 7, 0, 0
+; CHECK-NEXT:  .LBB3_4: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 7, sc at toc@l(4)
+; CHECK-NEXT:    lbz 8, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 6
+; CHECK-NEXT:    cmpw 8, 5
+; CHECK-NEXT:    bne 0, .LBB3_7
+; CHECK-NEXT:  # %bb.6: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stbcx. 7, 0, 6
+; CHECK-NEXT:    bne 0, .LBB3_5
+; CHECK-NEXT:    b .LBB3_8
+; CHECK-NEXT:  .LBB3_7: # %entry
+; CHECK-NEXT:    stbcx. 5, 0, 6
+; CHECK-NEXT:  .LBB3_8: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    addis 7, 2, ss at toc@ha
+; CHECK-NEXT:    stb 5, uc at toc@l(3)
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    addi 12, 7, ss at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 9, 8
+; CHECK-NEXT:  .LBB3_9: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 8, 0, 12
+; CHECK-NEXT:    cmpw 5, 8
+; CHECK-NEXT:    bne 0, .LBB3_11
+; CHECK-NEXT:  # %bb.10: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    sthcx. 9, 0, 12
+; CHECK-NEXT:    bne 0, .LBB3_9
+; CHECK-NEXT:    b .LBB3_12
+; CHECK-NEXT:  .LBB3_11: # %entry
+; CHECK-NEXT:    sthcx. 8, 0, 12
+; CHECK-NEXT:  .LBB3_12: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 8, ss at toc@l(7)
+; CHECK-NEXT:    addis 5, 2, us at toc@ha
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    lbz 7, uc at toc@l(3)
+; CHECK-NEXT:    addi 11, 5, us at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 9, 8
+; CHECK-NEXT:  .LBB3_13: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 8, 0, 11
+; CHECK-NEXT:    cmpw 7, 8
+; CHECK-NEXT:    bne 0, .LBB3_15
+; CHECK-NEXT:  # %bb.14: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    sthcx. 9, 0, 11
+; CHECK-NEXT:    bne 0, .LBB3_13
+; CHECK-NEXT:    b .LBB3_16
+; CHECK-NEXT:  .LBB3_15: # %entry
+; CHECK-NEXT:    sthcx. 8, 0, 11
+; CHECK-NEXT:  .LBB3_16: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 8, us at toc@l(5)
+; CHECK-NEXT:    addis 5, 2, si at toc@ha
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    lbz 7, uc at toc@l(3)
+; CHECK-NEXT:    addi 10, 5, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 9, 8
+; CHECK-NEXT:  .LBB3_17: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 8, 0, 10
+; CHECK-NEXT:    cmpw 7, 8
+; CHECK-NEXT:    bne 0, .LBB3_19
+; CHECK-NEXT:  # %bb.18: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 9, 0, 10
+; CHECK-NEXT:    bne 0, .LBB3_17
+; CHECK-NEXT:    b .LBB3_20
+; CHECK-NEXT:  .LBB3_19: # %entry
+; CHECK-NEXT:    stwcx. 8, 0, 10
+; CHECK-NEXT:  .LBB3_20: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 8, si at toc@l(5)
+; CHECK-NEXT:    addis 5, 2, ui at toc@ha
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    lbz 7, uc at toc@l(3)
+; CHECK-NEXT:    addi 9, 5, ui at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 30, 8
+; CHECK-NEXT:  .LBB3_21: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 8, 0, 9
+; CHECK-NEXT:    cmpw 7, 8
+; CHECK-NEXT:    bne 0, .LBB3_23
+; CHECK-NEXT:  # %bb.22: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 30, 0, 9
+; CHECK-NEXT:    bne 0, .LBB3_21
+; CHECK-NEXT:    b .LBB3_24
+; CHECK-NEXT:  .LBB3_23: # %entry
+; CHECK-NEXT:    stwcx. 8, 0, 9
+; CHECK-NEXT:  .LBB3_24: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 8, ui at toc@l(5)
+; CHECK-NEXT:    addis 7, 2, sll at toc@ha
+; CHECK-NEXT:    lbz 8, sc at toc@l(4)
+; CHECK-NEXT:    lbz 30, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 28, 8
+; CHECK-NEXT:    addi 8, 7, sll at toc@l
+; CHECK-NEXT:  .LBB3_25: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 29, 0, 8
+; CHECK-NEXT:    cmpd 30, 29
+; CHECK-NEXT:    bne 0, .LBB3_27
+; CHECK-NEXT:  # %bb.26: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 28, 0, 8
+; CHECK-NEXT:    bne 0, .LBB3_25
+; CHECK-NEXT:    b .LBB3_28
+; CHECK-NEXT:  .LBB3_27: # %entry
+; CHECK-NEXT:    stdcx. 29, 0, 8
+; CHECK-NEXT:  .LBB3_28: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 29, sll at toc@l(7)
+; CHECK-NEXT:    addis 30, 2, ull at toc@ha
+; CHECK-NEXT:    lbz 7, sc at toc@l(4)
+; CHECK-NEXT:    lbz 29, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    extsb 27, 7
+; CHECK-NEXT:    addi 7, 30, ull at toc@l
+; CHECK-NEXT:  .LBB3_29: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 28, 0, 7
+; CHECK-NEXT:    cmpd 29, 28
+; CHECK-NEXT:    bne 0, .LBB3_31
+; CHECK-NEXT:  # %bb.30: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 27, 0, 7
+; CHECK-NEXT:    bne 0, .LBB3_29
+; CHECK-NEXT:    b .LBB3_32
+; CHECK-NEXT:  .LBB3_31: # %entry
+; CHECK-NEXT:    stdcx. 28, 0, 7
+; CHECK-NEXT:  .LBB3_32: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 28, ull at toc@l(30)
+; CHECK-NEXT:    lbz 30, uc at toc@l(3)
+; CHECK-NEXT:    lbz 28, sc at toc@l(4)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_33: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 29, 0, 0
+; CHECK-NEXT:    cmpw 30, 29
+; CHECK-NEXT:    bne 0, .LBB3_35
+; CHECK-NEXT:  # %bb.34: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stbcx. 28, 0, 0
+; CHECK-NEXT:    bne 0, .LBB3_33
+; CHECK-NEXT:    b .LBB3_36
+; CHECK-NEXT:  .LBB3_35: # %entry
+; CHECK-NEXT:    stbcx. 29, 0, 0
+; CHECK-NEXT:  .LBB3_36: # %entry
+; CHECK-NEXT:    xor 0, 29, 30
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 0, 0
+; CHECK-NEXT:    lbz 29, sc at toc@l(4)
+; CHECK-NEXT:    srwi 0, 0, 5
+; CHECK-NEXT:    stw 0, ui at toc@l(5)
+; CHECK-NEXT:    lbz 0, uc at toc@l(3)
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_37: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 30, 0, 6
+; CHECK-NEXT:    cmpw 0, 30
+; CHECK-NEXT:    bne 0, .LBB3_39
+; CHECK-NEXT:  # %bb.38: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stbcx. 29, 0, 6
+; CHECK-NEXT:    bne 0, .LBB3_37
+; CHECK-NEXT:    b .LBB3_40
+; CHECK-NEXT:  .LBB3_39: # %entry
+; CHECK-NEXT:    stbcx. 30, 0, 6
+; CHECK-NEXT:  .LBB3_40: # %entry
+; CHECK-NEXT:    xor 6, 30, 0
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 6, 6
+; CHECK-NEXT:    lbz 0, sc at toc@l(4)
+; CHECK-NEXT:    srwi 6, 6, 5
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    extsb 30, 0
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_41: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 0, 0, 12
+; CHECK-NEXT:    cmpw 6, 0
+; CHECK-NEXT:    bne 0, .LBB3_43
+; CHECK-NEXT:  # %bb.42: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    sthcx. 30, 0, 12
+; CHECK-NEXT:    bne 0, .LBB3_41
+; CHECK-NEXT:    b .LBB3_44
+; CHECK-NEXT:  .LBB3_43: # %entry
+; CHECK-NEXT:    sthcx. 0, 0, 12
+; CHECK-NEXT:  .LBB3_44: # %entry
+; CHECK-NEXT:    xor 6, 0, 6
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 6, 6
+; CHECK-NEXT:    lbz 12, sc at toc@l(4)
+; CHECK-NEXT:    srwi 6, 6, 5
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    extsb 0, 12
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_45: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 12, 0, 11
+; CHECK-NEXT:    cmpw 6, 12
+; CHECK-NEXT:    bne 0, .LBB3_47
+; CHECK-NEXT:  # %bb.46: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    sthcx. 0, 0, 11
+; CHECK-NEXT:    bne 0, .LBB3_45
+; CHECK-NEXT:    b .LBB3_48
+; CHECK-NEXT:  .LBB3_47: # %entry
+; CHECK-NEXT:    sthcx. 12, 0, 11
+; CHECK-NEXT:  .LBB3_48: # %entry
+; CHECK-NEXT:    xor 6, 12, 6
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 6, 6
+; CHECK-NEXT:    lbz 11, sc at toc@l(4)
+; CHECK-NEXT:    srwi 6, 6, 5
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    extsb 12, 11
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_49: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 11, 0, 10
+; CHECK-NEXT:    cmpw 6, 11
+; CHECK-NEXT:    bne 0, .LBB3_51
+; CHECK-NEXT:  # %bb.50: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 12, 0, 10
+; CHECK-NEXT:    bne 0, .LBB3_49
+; CHECK-NEXT:    b .LBB3_52
+; CHECK-NEXT:  .LBB3_51: # %entry
+; CHECK-NEXT:    stwcx. 11, 0, 10
+; CHECK-NEXT:  .LBB3_52: # %entry
+; CHECK-NEXT:    xor 6, 11, 6
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 6, 6
+; CHECK-NEXT:    lbz 10, sc at toc@l(4)
+; CHECK-NEXT:    srwi 6, 6, 5
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    extsb 11, 10
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_53: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 10, 0, 9
+; CHECK-NEXT:    cmpw 6, 10
+; CHECK-NEXT:    bne 0, .LBB3_55
+; CHECK-NEXT:  # %bb.54: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 11, 0, 9
+; CHECK-NEXT:    bne 0, .LBB3_53
+; CHECK-NEXT:    b .LBB3_56
+; CHECK-NEXT:  .LBB3_55: # %entry
+; CHECK-NEXT:    stwcx. 10, 0, 9
+; CHECK-NEXT:  .LBB3_56: # %entry
+; CHECK-NEXT:    xor 6, 10, 6
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzw 6, 6
+; CHECK-NEXT:    lbz 9, sc at toc@l(4)
+; CHECK-NEXT:    srwi 6, 6, 5
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    lbz 6, uc at toc@l(3)
+; CHECK-NEXT:    extsb 10, 9
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_57: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 9, 0, 8
+; CHECK-NEXT:    cmpd 6, 9
+; CHECK-NEXT:    bne 0, .LBB3_59
+; CHECK-NEXT:  # %bb.58: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 10, 0, 8
+; CHECK-NEXT:    bne 0, .LBB3_57
+; CHECK-NEXT:    b .LBB3_60
+; CHECK-NEXT:  .LBB3_59: # %entry
+; CHECK-NEXT:    stdcx. 9, 0, 8
+; CHECK-NEXT:  .LBB3_60: # %entry
+; CHECK-NEXT:    xor 6, 9, 6
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzd 6, 6
+; CHECK-NEXT:    lbz 4, sc at toc@l(4)
+; CHECK-NEXT:    lbz 3, uc at toc@l(3)
+; CHECK-NEXT:    rldicl 6, 6, 58, 63
+; CHECK-NEXT:    stw 6, ui at toc@l(5)
+; CHECK-NEXT:    extsb 6, 4
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB3_61: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 4, 0, 7
+; CHECK-NEXT:    cmpd 3, 4
+; CHECK-NEXT:    bne 0, .LBB3_63
+; CHECK-NEXT:  # %bb.62: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 6, 0, 7
+; CHECK-NEXT:    bne 0, .LBB3_61
+; CHECK-NEXT:    b .LBB3_64
+; CHECK-NEXT:  .LBB3_63: # %entry
+; CHECK-NEXT:    stdcx. 4, 0, 7
+; CHECK-NEXT:  .LBB3_64: # %entry
+; CHECK-NEXT:    xor 3, 4, 3
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    cntlzd 3, 3
+; CHECK-NEXT:    ld 30, -16(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 29, -24(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 28, -32(1) # 8-byte Folded Reload
+; CHECK-NEXT:    ld 27, -40(1) # 8-byte Folded Reload
+; CHECK-NEXT:    rldicl 3, 3, 58, 63
+; CHECK-NEXT:    stw 3, ui at toc@l(5)
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_compare_and_swap:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -128(1)
+; AIX32-NEXT:    stw 28, 112(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 29, 116(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lwz 28, L..C0(2) # @sc
+; AIX32-NEXT:    lwz 29, L..C1(2) # @uc
+; AIX32-NEXT:    stw 23, 92(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 17, 68(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 18, 72(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 19, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lbz 3, 0(28)
+; AIX32-NEXT:    rlwinm 4, 28, 3, 27, 28
+; AIX32-NEXT:    lbz 5, 0(29)
+; AIX32-NEXT:    rlwinm 19, 28, 0, 0, 29
+; AIX32-NEXT:    xori 23, 4, 24
+; AIX32-NEXT:    li 4, 255
+; AIX32-NEXT:    slw 6, 3, 23
+; AIX32-NEXT:    slw 7, 5, 23
+; AIX32-NEXT:    slw 3, 4, 23
+; AIX32-NEXT:    stw 20, 80(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 21, 84(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 22, 88(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 24, 96(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 25, 100(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 26, 104(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 27, 108(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 30, 120(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 124(1) # 4-byte Folded Spill
+; AIX32-NEXT:    and 5, 6, 3
+; AIX32-NEXT:    and 6, 7, 3
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB3_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 19
+; AIX32-NEXT:    and 4, 7, 3
+; AIX32-NEXT:    cmpw 4, 6
+; AIX32-NEXT:    bne 0, L..BB3_3
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 7, 7, 3
+; AIX32-NEXT:    or 7, 7, 5
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:    bne 0, L..BB3_1
+; AIX32-NEXT:    b L..BB3_4
+; AIX32-NEXT:  L..BB3_3: # %entry
+; AIX32-NEXT:    stwcx. 7, 0, 19
+; AIX32-NEXT:  L..BB3_4: # %entry
+; AIX32-NEXT:    srw 3, 4, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    rlwinm 4, 29, 3, 27, 28
+; AIX32-NEXT:    lbz 5, 0(29)
+; AIX32-NEXT:    xori 25, 4, 24
+; AIX32-NEXT:    stb 3, 0(28)
+; AIX32-NEXT:    slw 4, 3, 25
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 6, 5, 25
+; AIX32-NEXT:    slw 3, 3, 25
+; AIX32-NEXT:    rlwinm 22, 29, 0, 0, 29
+; AIX32-NEXT:    and 5, 4, 3
+; AIX32-NEXT:    and 6, 6, 3
+; AIX32-NEXT:  L..BB3_5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 7, 0, 22
+; AIX32-NEXT:    and 4, 7, 3
+; AIX32-NEXT:    cmpw 4, 6
+; AIX32-NEXT:    bne 0, L..BB3_7
+; AIX32-NEXT:  # %bb.6: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 7, 7, 3
+; AIX32-NEXT:    or 7, 7, 5
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:    bne 0, L..BB3_5
+; AIX32-NEXT:    b L..BB3_8
+; AIX32-NEXT:  L..BB3_7: # %entry
+; AIX32-NEXT:    stwcx. 7, 0, 22
+; AIX32-NEXT:  L..BB3_8: # %entry
+; AIX32-NEXT:    lwz 3, L..C2(2) # @ss
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 7, 0
+; AIX32-NEXT:    srw 4, 4, 25
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    stb 4, 0(29)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 6, 3, 3, 27, 27
+; AIX32-NEXT:    extsb 5, 5
+; AIX32-NEXT:    xori 24, 6, 16
+; AIX32-NEXT:    ori 6, 7, 65535
+; AIX32-NEXT:    slw 5, 5, 24
+; AIX32-NEXT:    slw 7, 4, 24
+; AIX32-NEXT:    slw 4, 6, 24
+; AIX32-NEXT:    rlwinm 20, 3, 0, 0, 29
+; AIX32-NEXT:    and 6, 5, 4
+; AIX32-NEXT:    and 7, 7, 4
+; AIX32-NEXT:  L..BB3_9: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 20
+; AIX32-NEXT:    and 5, 8, 4
+; AIX32-NEXT:    cmpw 5, 7
+; AIX32-NEXT:    bne 0, L..BB3_11
+; AIX32-NEXT:  # %bb.10: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 8, 8, 4
+; AIX32-NEXT:    or 8, 8, 6
+; AIX32-NEXT:    stwcx. 8, 0, 20
+; AIX32-NEXT:    bne 0, L..BB3_9
+; AIX32-NEXT:    b L..BB3_12
+; AIX32-NEXT:  L..BB3_11: # %entry
+; AIX32-NEXT:    stwcx. 8, 0, 20
+; AIX32-NEXT:  L..BB3_12: # %entry
+; AIX32-NEXT:    lwz 4, L..C3(2) # @us
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 5, 5, 24
+; AIX32-NEXT:    lbz 6, 0(28)
+; AIX32-NEXT:    sth 5, 0(3)
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lbz 7, 0(29)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    rlwinm 3, 4, 3, 27, 27
+; AIX32-NEXT:    extsb 6, 6
+; AIX32-NEXT:    xori 21, 3, 16
+; AIX32-NEXT:    ori 3, 5, 65535
+; AIX32-NEXT:    slw 6, 6, 21
+; AIX32-NEXT:    slw 7, 7, 21
+; AIX32-NEXT:    slw 5, 3, 21
+; AIX32-NEXT:    rlwinm 18, 4, 0, 0, 29
+; AIX32-NEXT:    and 6, 6, 5
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:  L..BB3_13: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 18
+; AIX32-NEXT:    and 3, 8, 5
+; AIX32-NEXT:    cmpw 3, 7
+; AIX32-NEXT:    bne 0, L..BB3_15
+; AIX32-NEXT:  # %bb.14: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 8, 8, 5
+; AIX32-NEXT:    or 8, 8, 6
+; AIX32-NEXT:    stwcx. 8, 0, 18
+; AIX32-NEXT:    bne 0, L..BB3_13
+; AIX32-NEXT:    b L..BB3_16
+; AIX32-NEXT:  L..BB3_15: # %entry
+; AIX32-NEXT:    stwcx. 8, 0, 18
+; AIX32-NEXT:  L..BB3_16: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 3, 3, 21
+; AIX32-NEXT:    lwz 17, L..C4(2) # @si
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    sth 3, 0(4)
+; AIX32-NEXT:    lbz 3, 0(29)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    extsb 5, 5
+; AIX32-NEXT:  L..BB3_17: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 17
+; AIX32-NEXT:    cmpw 3, 4
+; AIX32-NEXT:    bne 0, L..BB3_19
+; AIX32-NEXT:  # %bb.18: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:    bne 0, L..BB3_17
+; AIX32-NEXT:    b L..BB3_20
+; AIX32-NEXT:  L..BB3_19: # %entry
+; AIX32-NEXT:    stwcx. 4, 0, 17
+; AIX32-NEXT:  L..BB3_20: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(17)
+; AIX32-NEXT:    lwz 27, L..C5(2) # @ui
+; AIX32-NEXT:    lbz 4, 0(28)
+; AIX32-NEXT:    lbz 3, 0(29)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    extsb 5, 4
+; AIX32-NEXT:  L..BB3_21: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 27
+; AIX32-NEXT:    cmpw 3, 4
+; AIX32-NEXT:    bne 0, L..BB3_23
+; AIX32-NEXT:  # %bb.22: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 5, 0, 27
+; AIX32-NEXT:    bne 0, L..BB3_21
+; AIX32-NEXT:    b L..BB3_24
+; AIX32-NEXT:  L..BB3_23: # %entry
+; AIX32-NEXT:    stwcx. 4, 0, 27
+; AIX32-NEXT:  L..BB3_24: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(27)
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    li 26, 0
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    lbz 4, 0(28)
+; AIX32-NEXT:    lbz 3, 0(29)
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    stw 26, 56(1)
+; AIX32-NEXT:    extsb 6, 4
+; AIX32-NEXT:    stw 3, 60(1)
+; AIX32-NEXT:    addi 4, 1, 56
+; AIX32-NEXT:    srawi 5, 6, 31
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    lwz 3, 60(1)
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    lwz 4, 56(1)
+; AIX32-NEXT:    lbz 9, 0(29)
+; AIX32-NEXT:    extsb 6, 5
+; AIX32-NEXT:    stw 3, 4(31)
+; AIX32-NEXT:    stw 4, 0(31)
+; AIX32-NEXT:    srawi 5, 6, 31
+; AIX32-NEXT:    addi 4, 1, 56
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    stw 9, 60(1)
+; AIX32-NEXT:    stw 26, 56(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 3, 60(1)
+; AIX32-NEXT:    lwz 5, 56(1)
+; AIX32-NEXT:    lbz 6, 0(28)
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    stw 3, 4(30)
+; AIX32-NEXT:    li 3, 255
+; AIX32-NEXT:    stw 5, 0(30)
+; AIX32-NEXT:    slw 5, 6, 23
+; AIX32-NEXT:    slw 7, 4, 23
+; AIX32-NEXT:    slw 3, 3, 23
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    and 6, 5, 3
+; AIX32-NEXT:    and 7, 7, 3
+; AIX32-NEXT:  L..BB3_25: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 19
+; AIX32-NEXT:    and 5, 8, 3
+; AIX32-NEXT:    cmpw 5, 7
+; AIX32-NEXT:    bne 0, L..BB3_27
+; AIX32-NEXT:  # %bb.26: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 8, 8, 3
+; AIX32-NEXT:    or 8, 8, 6
+; AIX32-NEXT:    stwcx. 8, 0, 19
+; AIX32-NEXT:    bne 0, L..BB3_25
+; AIX32-NEXT:    b L..BB3_28
+; AIX32-NEXT:  L..BB3_27: # %entry
+; AIX32-NEXT:    stwcx. 8, 0, 19
+; AIX32-NEXT:  L..BB3_28: # %entry
+; AIX32-NEXT:    srw 5, 5, 23
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 3, 1
+; AIX32-NEXT:    li 7, 255
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    iseleq 6, 3, 26
+; AIX32-NEXT:    stw 6, 0(27)
+; AIX32-NEXT:    slw 5, 5, 25
+; AIX32-NEXT:    slw 8, 4, 25
+; AIX32-NEXT:    slw 6, 7, 25
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    and 7, 5, 6
+; AIX32-NEXT:    and 8, 8, 6
+; AIX32-NEXT:  L..BB3_29: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 9, 0, 22
+; AIX32-NEXT:    and 5, 9, 6
+; AIX32-NEXT:    cmpw 5, 8
+; AIX32-NEXT:    bne 0, L..BB3_31
+; AIX32-NEXT:  # %bb.30: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 9, 9, 6
+; AIX32-NEXT:    or 9, 9, 7
+; AIX32-NEXT:    stwcx. 9, 0, 22
+; AIX32-NEXT:    bne 0, L..BB3_29
+; AIX32-NEXT:    b L..BB3_32
+; AIX32-NEXT:  L..BB3_31: # %entry
+; AIX32-NEXT:    stwcx. 9, 0, 22
+; AIX32-NEXT:  L..BB3_32: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 5, 5, 25
+; AIX32-NEXT:    lbz 6, 0(28)
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    iseleq 7, 3, 26
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    extsb 6, 6
+; AIX32-NEXT:    stw 7, 0(27)
+; AIX32-NEXT:    slw 7, 6, 24
+; AIX32-NEXT:    slw 8, 4, 24
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 6, 5, 24
+; AIX32-NEXT:    and 7, 7, 6
+; AIX32-NEXT:    and 8, 8, 6
+; AIX32-NEXT:  L..BB3_33: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 9, 0, 20
+; AIX32-NEXT:    and 5, 9, 6
+; AIX32-NEXT:    cmpw 5, 8
+; AIX32-NEXT:    bne 0, L..BB3_35
+; AIX32-NEXT:  # %bb.34: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 9, 9, 6
+; AIX32-NEXT:    or 9, 9, 7
+; AIX32-NEXT:    stwcx. 9, 0, 20
+; AIX32-NEXT:    bne 0, L..BB3_33
+; AIX32-NEXT:    b L..BB3_36
+; AIX32-NEXT:  L..BB3_35: # %entry
+; AIX32-NEXT:    stwcx. 9, 0, 20
+; AIX32-NEXT:  L..BB3_36: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    srw 5, 5, 24
+; AIX32-NEXT:    lbz 6, 0(28)
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    iseleq 7, 3, 26
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    extsb 6, 6
+; AIX32-NEXT:    stw 7, 0(27)
+; AIX32-NEXT:    slw 7, 6, 21
+; AIX32-NEXT:    slw 8, 4, 21
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    slw 6, 5, 21
+; AIX32-NEXT:    and 7, 7, 6
+; AIX32-NEXT:    and 8, 8, 6
+; AIX32-NEXT:  L..BB3_37: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 9, 0, 18
+; AIX32-NEXT:    and 5, 9, 6
+; AIX32-NEXT:    cmpw 5, 8
+; AIX32-NEXT:    bne 0, L..BB3_39
+; AIX32-NEXT:  # %bb.38: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 9, 9, 6
+; AIX32-NEXT:    or 9, 9, 7
+; AIX32-NEXT:    stwcx. 9, 0, 18
+; AIX32-NEXT:    bne 0, L..BB3_37
+; AIX32-NEXT:    b L..BB3_40
+; AIX32-NEXT:  L..BB3_39: # %entry
+; AIX32-NEXT:    stwcx. 9, 0, 18
+; AIX32-NEXT:  L..BB3_40: # %entry
+; AIX32-NEXT:    srw 5, 5, 21
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    iseleq 4, 3, 26
+; AIX32-NEXT:    stw 4, 0(27)
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    extsb 6, 5
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB3_41: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 17
+; AIX32-NEXT:    cmpw 4, 5
+; AIX32-NEXT:    bne 0, L..BB3_43
+; AIX32-NEXT:  # %bb.42: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 6, 0, 17
+; AIX32-NEXT:    bne 0, L..BB3_41
+; AIX32-NEXT:    b L..BB3_44
+; AIX32-NEXT:  L..BB3_43: # %entry
+; AIX32-NEXT:    stwcx. 5, 0, 17
+; AIX32-NEXT:  L..BB3_44: # %entry
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    iseleq 4, 3, 26
+; AIX32-NEXT:    lbz 5, 0(28)
+; AIX32-NEXT:    stw 4, 0(27)
+; AIX32-NEXT:    lbz 4, 0(29)
+; AIX32-NEXT:    extsb 6, 5
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB3_45: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 27
+; AIX32-NEXT:    cmpw 4, 5
+; AIX32-NEXT:    bne 0, L..BB3_47
+; AIX32-NEXT:  # %bb.46: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 6, 0, 27
+; AIX32-NEXT:    bne 0, L..BB3_45
+; AIX32-NEXT:    b L..BB3_48
+; AIX32-NEXT:  L..BB3_47: # %entry
+; AIX32-NEXT:    stwcx. 5, 0, 27
+; AIX32-NEXT:  L..BB3_48: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    lbz 4, 0(28)
+; AIX32-NEXT:    iseleq 3, 3, 26
+; AIX32-NEXT:    lbz 9, 0(29)
+; AIX32-NEXT:    stw 3, 0(27)
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    extsb 6, 4
+; AIX32-NEXT:    addi 4, 1, 56
+; AIX32-NEXT:    srawi 5, 6, 31
+; AIX32-NEXT:    stw 9, 60(1)
+; AIX32-NEXT:    stw 26, 56(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lbz 4, 0(28)
+; AIX32-NEXT:    lbz 9, 0(29)
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    stw 3, 0(27)
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    extsb 6, 4
+; AIX32-NEXT:    addi 4, 1, 56
+; AIX32-NEXT:    srawi 5, 6, 31
+; AIX32-NEXT:    stw 9, 60(1)
+; AIX32-NEXT:    stw 26, 56(1)
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    stw 3, 0(27)
+; AIX32-NEXT:    lwz 31, 124(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 30, 120(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 29, 116(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 112(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 27, 108(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 26, 104(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 25, 100(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 24, 96(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 23, 92(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 22, 88(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 21, 84(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 20, 80(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 19, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 18, 72(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 17, 68(1) # 4-byte Folded Reload
+; AIX32-NEXT:    addi 1, 1, 128
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = load i8, ptr @uc, align 1
+  %1 = load i8, ptr @sc, align 1
+  %2 = cmpxchg ptr @sc, i8 %0, i8 %1 seq_cst seq_cst, align 1
+  %3 = extractvalue { i8, i1 } %2, 0
+  store i8 %3, ptr @sc, align 1
+  %4 = load i8, ptr @uc, align 1
+  %5 = cmpxchg ptr @uc, i8 %4, i8 %3 seq_cst seq_cst, align 1
+  %6 = extractvalue { i8, i1 } %5, 0
+  store i8 %6, ptr @uc, align 1
+  %conv = zext i8 %6 to i16
+  %7 = load i8, ptr @sc, align 1
+  %conv1 = sext i8 %7 to i16
+  %8 = cmpxchg ptr @ss, i16 %conv, i16 %conv1 seq_cst seq_cst, align 2
+  %9 = extractvalue { i16, i1 } %8, 0
+  store i16 %9, ptr @ss, align 2
+  %10 = load i8, ptr @uc, align 1
+  %conv2 = zext i8 %10 to i16
+  %11 = load i8, ptr @sc, align 1
+  %conv3 = sext i8 %11 to i16
+  %12 = cmpxchg ptr @us, i16 %conv2, i16 %conv3 seq_cst seq_cst, align 2
+  %13 = extractvalue { i16, i1 } %12, 0
+  store i16 %13, ptr @us, align 2
+  %14 = load i8, ptr @uc, align 1
+  %conv4 = zext i8 %14 to i32
+  %15 = load i8, ptr @sc, align 1
+  %conv5 = sext i8 %15 to i32
+  %16 = cmpxchg ptr @si, i32 %conv4, i32 %conv5 seq_cst seq_cst, align 4
+  %17 = extractvalue { i32, i1 } %16, 0
+  store i32 %17, ptr @si, align 4
+  %18 = load i8, ptr @uc, align 1
+  %conv6 = zext i8 %18 to i32
+  %19 = load i8, ptr @sc, align 1
+  %conv7 = sext i8 %19 to i32
+  %20 = cmpxchg ptr @ui, i32 %conv6, i32 %conv7 seq_cst seq_cst, align 4
+  %21 = extractvalue { i32, i1 } %20, 0
+  store i32 %21, ptr @ui, align 4
+  %22 = load i8, ptr @uc, align 1
+  %conv8 = zext i8 %22 to i64
+  %23 = load i8, ptr @sc, align 1
+  %conv9 = sext i8 %23 to i64
+  %24 = cmpxchg ptr @sll, i64 %conv8, i64 %conv9 seq_cst seq_cst, align 8
+  %25 = extractvalue { i64, i1 } %24, 0
+  store i64 %25, ptr @sll, align 8
+  %26 = load i8, ptr @uc, align 1
+  %conv10 = zext i8 %26 to i64
+  %27 = load i8, ptr @sc, align 1
+  %conv11 = sext i8 %27 to i64
+  %28 = cmpxchg ptr @ull, i64 %conv10, i64 %conv11 seq_cst seq_cst, align 8
+  %29 = extractvalue { i64, i1 } %28, 0
+  store i64 %29, ptr @ull, align 8
+  %30 = load i8, ptr @uc, align 1
+  %31 = load i8, ptr @sc, align 1
+  %32 = cmpxchg ptr @sc, i8 %30, i8 %31 seq_cst seq_cst, align 1
+  %33 = extractvalue { i8, i1 } %32, 1
+  %conv12 = zext i1 %33 to i32
+  store i32 %conv12, ptr @ui, align 4
+  %34 = load i8, ptr @uc, align 1
+  %35 = load i8, ptr @sc, align 1
+  %36 = cmpxchg ptr @uc, i8 %34, i8 %35 seq_cst seq_cst, align 1
+  %37 = extractvalue { i8, i1 } %36, 1
+  %conv13 = zext i1 %37 to i32
+  store i32 %conv13, ptr @ui, align 4
+  %38 = load i8, ptr @uc, align 1
+  %conv14 = zext i8 %38 to i16
+  %39 = load i8, ptr @sc, align 1
+  %conv15 = sext i8 %39 to i16
+  %40 = cmpxchg ptr @ss, i16 %conv14, i16 %conv15 seq_cst seq_cst, align 2
+  %41 = extractvalue { i16, i1 } %40, 1
+  %conv16 = zext i1 %41 to i32
+  store i32 %conv16, ptr @ui, align 4
+  %42 = load i8, ptr @uc, align 1
+  %conv17 = zext i8 %42 to i16
+  %43 = load i8, ptr @sc, align 1
+  %conv18 = sext i8 %43 to i16
+  %44 = cmpxchg ptr @us, i16 %conv17, i16 %conv18 seq_cst seq_cst, align 2
+  %45 = extractvalue { i16, i1 } %44, 1
+  %conv19 = zext i1 %45 to i32
+  store i32 %conv19, ptr @ui, align 4
+  %46 = load i8, ptr @uc, align 1
+  %conv20 = zext i8 %46 to i32
+  %47 = load i8, ptr @sc, align 1
+  %conv21 = sext i8 %47 to i32
+  %48 = cmpxchg ptr @si, i32 %conv20, i32 %conv21 seq_cst seq_cst, align 4
+  %49 = extractvalue { i32, i1 } %48, 1
+  %conv22 = zext i1 %49 to i32
+  store i32 %conv22, ptr @ui, align 4
+  %50 = load i8, ptr @uc, align 1
+  %conv23 = zext i8 %50 to i32
+  %51 = load i8, ptr @sc, align 1
+  %conv24 = sext i8 %51 to i32
+  %52 = cmpxchg ptr @ui, i32 %conv23, i32 %conv24 seq_cst seq_cst, align 4
+  %53 = extractvalue { i32, i1 } %52, 1
+  %conv25 = zext i1 %53 to i32
+  store i32 %conv25, ptr @ui, align 4
+  %54 = load i8, ptr @uc, align 1
+  %conv26 = zext i8 %54 to i64
+  %55 = load i8, ptr @sc, align 1
+  %conv27 = sext i8 %55 to i64
+  %56 = cmpxchg ptr @sll, i64 %conv26, i64 %conv27 seq_cst seq_cst, align 8
+  %57 = extractvalue { i64, i1 } %56, 1
+  %conv28 = zext i1 %57 to i32
+  store i32 %conv28, ptr @ui, align 4
+  %58 = load i8, ptr @uc, align 1
+  %conv29 = zext i8 %58 to i64
+  %59 = load i8, ptr @sc, align 1
+  %conv30 = sext i8 %59 to i64
+  %60 = cmpxchg ptr @ull, i64 %conv29, i64 %conv30 seq_cst seq_cst, align 8
+  %61 = extractvalue { i64, i1 } %60, 1
+  %conv31 = zext i1 %61 to i32
+  store i32 %conv31, ptr @ui, align 4
+  ret void
+}
+
+define dso_local void @test_lock() local_unnamed_addr #0 {
+; CHECK-LABEL: test_lock:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 3, 2, sc at toc@ha
+; CHECK-NEXT:    li 7, 1
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    addi 4, 3, sc at toc@l
+; CHECK-NEXT:  .LBB4_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 4
+; CHECK-NEXT:    stbcx. 7, 0, 4
+; CHECK-NEXT:    bne 0, .LBB4_1
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    addis 4, 2, uc at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 5, sc at toc@l(3)
+; CHECK-NEXT:    addi 6, 4, uc at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_3: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 6
+; CHECK-NEXT:    stbcx. 7, 0, 6
+; CHECK-NEXT:    bne 0, .LBB4_3
+; CHECK-NEXT:  # %bb.4: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 5, uc at toc@l(4)
+; CHECK-NEXT:    addis 5, 2, ss at toc@ha
+; CHECK-NEXT:    addi 8, 5, ss at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 6, 0, 8
+; CHECK-NEXT:    sthcx. 7, 0, 8
+; CHECK-NEXT:    bne 0, .LBB4_5
+; CHECK-NEXT:  # %bb.6: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 6, ss at toc@l(5)
+; CHECK-NEXT:    addis 6, 2, us at toc@ha
+; CHECK-NEXT:    addi 9, 6, us at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_7: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 8, 0, 9
+; CHECK-NEXT:    sthcx. 7, 0, 9
+; CHECK-NEXT:    bne 0, .LBB4_7
+; CHECK-NEXT:  # %bb.8: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 8, us at toc@l(6)
+; CHECK-NEXT:    addis 8, 2, si at toc@ha
+; CHECK-NEXT:    addi 10, 8, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_9: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 9, 0, 10
+; CHECK-NEXT:    stwcx. 7, 0, 10
+; CHECK-NEXT:    bne 0, .LBB4_9
+; CHECK-NEXT:  # %bb.10: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 9, si at toc@l(8)
+; CHECK-NEXT:    addis 9, 2, ui at toc@ha
+; CHECK-NEXT:    addi 11, 9, ui at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_11: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 10, 0, 11
+; CHECK-NEXT:    stwcx. 7, 0, 11
+; CHECK-NEXT:    bne 0, .LBB4_11
+; CHECK-NEXT:  # %bb.12: # %entry
+; CHECK-NEXT:    addis 7, 2, sll at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 10, ui at toc@l(9)
+; CHECK-NEXT:    li 11, 1
+; CHECK-NEXT:    addi 10, 7, sll at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_13: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 12, 0, 10
+; CHECK-NEXT:    stdcx. 11, 0, 10
+; CHECK-NEXT:    bne 0, .LBB4_13
+; CHECK-NEXT:  # %bb.14: # %entry
+; CHECK-NEXT:    addis 10, 2, ull at toc@ha
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 12, sll at toc@l(7)
+; CHECK-NEXT:    addi 0, 10, ull at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB4_15: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 12, 0, 0
+; CHECK-NEXT:    stdcx. 11, 0, 0
+; CHECK-NEXT:    bne 0, .LBB4_15
+; CHECK-NEXT:  # %bb.16: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 12, ull at toc@l(10)
+; CHECK-NEXT:    li 11, 0
+; CHECK-NEXT:    sync
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 11, sc at toc@l(3)
+; CHECK-NEXT:    li 3, 0
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stb 11, uc at toc@l(4)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 11, ss at toc@l(5)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    sth 11, us at toc@l(6)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 11, si at toc@l(8)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 11, ui at toc@l(9)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 3, sll at toc@l(7)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    std 3, ull at toc@l(10)
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_lock:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -96(1)
+; AIX32-NEXT:    stw 29, 84(1) # 4-byte Folded Spill
+; AIX32-NEXT:    lwz 29, L..C0(2) # @sc
+; AIX32-NEXT:    li 3, 1
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    stw 23, 60(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 24, 64(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 25, 68(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 26, 72(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 4, 29, 3, 27, 28
+; AIX32-NEXT:    stw 27, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT:    xori 4, 4, 24
+; AIX32-NEXT:    stw 28, 80(1) # 4-byte Folded Spill
+; AIX32-NEXT:    slw 8, 3, 4
+; AIX32-NEXT:    slw 6, 5, 4
+; AIX32-NEXT:    stw 30, 88(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 92(1) # 4-byte Folded Spill
+; AIX32-NEXT:    rlwinm 7, 29, 0, 0, 29
+; AIX32-NEXT:    and 8, 8, 6
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB4_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 7
+; AIX32-NEXT:    andc 9, 5, 6
+; AIX32-NEXT:    or 9, 8, 9
+; AIX32-NEXT:    stwcx. 9, 0, 7
+; AIX32-NEXT:    bne 0, L..BB4_1
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    lwz 28, L..C1(2) # @uc
+; AIX32-NEXT:    srw 4, 5, 4
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 255
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    stb 4, 0(29)
+; AIX32-NEXT:    rlwinm 4, 28, 3, 27, 28
+; AIX32-NEXT:    rlwinm 6, 28, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 4, 4, 24
+; AIX32-NEXT:    slw 7, 3, 4
+; AIX32-NEXT:    slw 5, 5, 4
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:  L..BB4_3: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 6
+; AIX32-NEXT:    andc 9, 8, 5
+; AIX32-NEXT:    or 9, 7, 9
+; AIX32-NEXT:    stwcx. 9, 0, 6
+; AIX32-NEXT:    bne 0, L..BB4_3
+; AIX32-NEXT:  # %bb.4: # %entry
+; AIX32-NEXT:    lwz 27, L..C2(2) # @ss
+; AIX32-NEXT:    srw 4, 8, 4
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 24
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    stb 4, 0(28)
+; AIX32-NEXT:    rlwinm 4, 27, 3, 27, 27
+; AIX32-NEXT:    rlwinm 6, 27, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 4, 4, 16
+; AIX32-NEXT:    slw 7, 3, 4
+; AIX32-NEXT:    slw 5, 5, 4
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:  L..BB4_5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 6
+; AIX32-NEXT:    andc 9, 8, 5
+; AIX32-NEXT:    or 9, 7, 9
+; AIX32-NEXT:    stwcx. 9, 0, 6
+; AIX32-NEXT:    bne 0, L..BB4_5
+; AIX32-NEXT:  # %bb.6: # %entry
+; AIX32-NEXT:    lwz 26, L..C3(2) # @us
+; AIX32-NEXT:    srw 4, 8, 4
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    ori 5, 5, 65535
+; AIX32-NEXT:    sth 4, 0(27)
+; AIX32-NEXT:    rlwinm 4, 26, 3, 27, 27
+; AIX32-NEXT:    rlwinm 6, 26, 0, 0, 29
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 4, 4, 16
+; AIX32-NEXT:    slw 7, 3, 4
+; AIX32-NEXT:    slw 5, 5, 4
+; AIX32-NEXT:    and 7, 7, 5
+; AIX32-NEXT:  L..BB4_7: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 6
+; AIX32-NEXT:    andc 9, 8, 5
+; AIX32-NEXT:    or 9, 7, 9
+; AIX32-NEXT:    stwcx. 9, 0, 6
+; AIX32-NEXT:    bne 0, L..BB4_7
+; AIX32-NEXT:  # %bb.8: # %entry
+; AIX32-NEXT:    srw 4, 8, 4
+; AIX32-NEXT:    lwz 25, L..C4(2) # @si
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 4, 4, 16
+; AIX32-NEXT:    sth 4, 0(26)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB4_9: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 25
+; AIX32-NEXT:    stwcx. 3, 0, 25
+; AIX32-NEXT:    bne 0, L..BB4_9
+; AIX32-NEXT:  # %bb.10: # %entry
+; AIX32-NEXT:    lwz 24, L..C5(2) # @ui
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(25)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB4_11: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 24
+; AIX32-NEXT:    stwcx. 3, 0, 24
+; AIX32-NEXT:    bne 0, L..BB4_11
+; AIX32-NEXT:  # %bb.12: # %entry
+; AIX32-NEXT:    lwz 31, L..C6(2) # @sll
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 4, 0(24)
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    li 23, 0
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    bl .__atomic_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 30, L..C7(2) # @ull
+; AIX32-NEXT:    mr 7, 3
+; AIX32-NEXT:    mr 8, 4
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 1
+; AIX32-NEXT:    li 6, 5
+; AIX32-NEXT:    stw 8, 4(31)
+; AIX32-NEXT:    stw 7, 0(31)
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    bl .__atomic_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    stw 4, 4(30)
+; AIX32-NEXT:    stw 3, 0(30)
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    mr 3, 31
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    li 6, 3
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stb 23, 0(29)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stb 23, 0(28)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sth 23, 0(27)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    sth 23, 0(26)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 23, 0(25)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 23, 0(24)
+; AIX32-NEXT:    bl .__atomic_store_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    mr 3, 30
+; AIX32-NEXT:    li 4, 0
+; AIX32-NEXT:    li 5, 0
+; AIX32-NEXT:    li 6, 3
+; AIX32-NEXT:    bl .__atomic_store_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 31, 92(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 30, 88(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 29, 84(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 80(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 27, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 26, 72(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 25, 68(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 24, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 23, 60(1) # 4-byte Folded Reload
+; AIX32-NEXT:    addi 1, 1, 96
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw xchg ptr @sc, i8 1 seq_cst, align 1
+  store i8 %0, ptr @sc, align 1
+  %1 = atomicrmw xchg ptr @uc, i8 1 seq_cst, align 1
+  store i8 %1, ptr @uc, align 1
+  %2 = atomicrmw xchg ptr @ss, i16 1 seq_cst, align 2
+  store i16 %2, ptr @ss, align 2
+  %3 = atomicrmw xchg ptr @us, i16 1 seq_cst, align 2
+  store i16 %3, ptr @us, align 2
+  %4 = atomicrmw xchg ptr @si, i32 1 seq_cst, align 4
+  store i32 %4, ptr @si, align 4
+  %5 = atomicrmw xchg ptr @ui, i32 1 seq_cst, align 4
+  store i32 %5, ptr @ui, align 4
+  %6 = atomicrmw xchg ptr @sll, i64 1 seq_cst, align 8
+  store i64 %6, ptr @sll, align 8
+  %7 = atomicrmw xchg ptr @ull, i64 1 seq_cst, align 8
+  store i64 %7, ptr @ull, align 8
+  fence seq_cst
+  store atomic i8 0, ptr @sc release, align 1
+  store atomic i8 0, ptr @uc release, align 1
+  store atomic i16 0, ptr @ss release, align 2
+  store atomic i16 0, ptr @us release, align 2
+  store atomic i32 0, ptr @si release, align 4
+  store atomic i32 0, ptr @ui release, align 4
+  store atomic i64 0, ptr @sll release, align 8
+  store atomic i64 0, ptr @ull release, align 8
+  ret void
+}
+
+define dso_local void @test_atomic() local_unnamed_addr #0 {
+; CHECK-LABEL: test_atomic:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addis 4, 2, ui at toc@ha
+; CHECK-NEXT:    li 3, 5
+; CHECK-NEXT:    addi 6, 4, ui at toc@l
+; CHECK-NEXT:  .LBB5_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 5, 0, 6
+; CHECK-NEXT:    cmplw 3, 5
+; CHECK-NEXT:    bge 0, .LBB5_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 3, 0, 6
+; CHECK-NEXT:    bne 0, .LBB5_1
+; CHECK-NEXT:  .LBB5_3: # %entry
+; CHECK-NEXT:    stw 5, ui at toc@l(4)
+; CHECK-NEXT:    addis 5, 2, si at toc@ha
+; CHECK-NEXT:    addi 7, 5, si at toc@l
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB5_4: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 8, 0, 7
+; CHECK-NEXT:    cmpw 3, 8
+; CHECK-NEXT:    bge 0, .LBB5_6
+; CHECK-NEXT:  # %bb.5: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 3, 0, 7
+; CHECK-NEXT:    bne 0, .LBB5_4
+; CHECK-NEXT:  .LBB5_6: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 8, si at toc@l(5)
+; CHECK-NEXT:  .LBB5_7: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 8, 0, 6
+; CHECK-NEXT:    cmplw 3, 8
+; CHECK-NEXT:    ble 0, .LBB5_9
+; CHECK-NEXT:  # %bb.8: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 3, 0, 6
+; CHECK-NEXT:    bne 0, .LBB5_7
+; CHECK-NEXT:  .LBB5_9: # %entry
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    stw 8, ui at toc@l(4)
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:  .LBB5_10: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 4, 0, 7
+; CHECK-NEXT:    cmpw 3, 4
+; CHECK-NEXT:    ble 0, .LBB5_12
+; CHECK-NEXT:  # %bb.11: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 3, 0, 7
+; CHECK-NEXT:    bne 0, .LBB5_10
+; CHECK-NEXT:  .LBB5_12: # %entry
+; CHECK-NEXT:    stw 4, si at toc@l(5)
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: test_atomic:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    lwz 4, L..C5(2) # @ui
+; AIX32-NEXT:    li 3, 5
+; AIX32-NEXT:  L..BB5_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 4
+; AIX32-NEXT:    cmplw 3, 5
+; AIX32-NEXT:    bge 0, L..BB5_3
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 3, 0, 4
+; AIX32-NEXT:    bne 0, L..BB5_1
+; AIX32-NEXT:  L..BB5_3: # %entry
+; AIX32-NEXT:    stw 5, 0(4)
+; AIX32-NEXT:    lwz 5, L..C4(2) # @si
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB5_4: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 5
+; AIX32-NEXT:    cmpw 3, 6
+; AIX32-NEXT:    bge 0, L..BB5_6
+; AIX32-NEXT:  # %bb.5: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 3, 0, 5
+; AIX32-NEXT:    bne 0, L..BB5_4
+; AIX32-NEXT:  L..BB5_6: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 6, 0(5)
+; AIX32-NEXT:  L..BB5_7: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 6, 0, 4
+; AIX32-NEXT:    cmplw 3, 6
+; AIX32-NEXT:    ble 0, L..BB5_9
+; AIX32-NEXT:  # %bb.8: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 3, 0, 4
+; AIX32-NEXT:    bne 0, L..BB5_7
+; AIX32-NEXT:  L..BB5_9: # %entry
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    stw 6, 0(4)
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:  L..BB5_10: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 4, 0, 5
+; AIX32-NEXT:    cmpw 3, 4
+; AIX32-NEXT:    ble 0, L..BB5_12
+; AIX32-NEXT:  # %bb.11: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 3, 0, 5
+; AIX32-NEXT:    bne 0, L..BB5_10
+; AIX32-NEXT:  L..BB5_12: # %entry
+; AIX32-NEXT:    stw 4, 0(5)
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw umin ptr @ui, i32 5 monotonic, align 4
+  store i32 %0, ptr @ui, align 4
+  %1 = atomicrmw min ptr @si, i32 5 seq_cst, align 4
+  store i32 %1, ptr @si, align 4
+  %2 = atomicrmw umax ptr @ui, i32 5 acquire, align 4
+  store i32 %2, ptr @ui, align 4
+  %3 = atomicrmw max ptr @si, i32 5 release, align 4
+  store i32 %3, ptr @si, align 4
+  ret void
+}
+
+define dso_local i64 @cmpswplp(ptr noundef %ptr, ptr nocapture noundef readnone %oldval, i64 noundef %newval) local_unnamed_addr #0 {
+; CHECK-LABEL: cmpswplp:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    addi 6, 5, 1
+; CHECK-NEXT:  .LBB6_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 4, 0, 3
+; CHECK-NEXT:    cmpd 5, 4
+; CHECK-NEXT:    bne 0, .LBB6_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 6, 0, 3
+; CHECK-NEXT:    bne 0, .LBB6_1
+; CHECK-NEXT:    b .LBB6_4
+; CHECK-NEXT:  .LBB6_3: # %entry
+; CHECK-NEXT:    stdcx. 4, 0, 3
+; CHECK-NEXT:  .LBB6_4: # %entry
+; CHECK-NEXT:    cmpd 4, 5
+; CHECK-NEXT:    li 3, 66
+; CHECK-NEXT:    li 4, 55
+; CHECK-NEXT:    iseleq 3, 4, 3
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: cmpswplp:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -64(1)
+; AIX32-NEXT:    addic 7, 6, 1
+; AIX32-NEXT:    stw 6, 60(1)
+; AIX32-NEXT:    addi 4, 1, 56
+; AIX32-NEXT:    addze 8, 5
+; AIX32-NEXT:    stw 5, 56(1)
+; AIX32-NEXT:    mr 6, 7
+; AIX32-NEXT:    mr 5, 8
+; AIX32-NEXT:    li 7, 0
+; AIX32-NEXT:    li 8, 0
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    andi. 3, 3, 1
+; AIX32-NEXT:    li 4, 55
+; AIX32-NEXT:    li 3, 66
+; AIX32-NEXT:    iselgt 4, 4, 3
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    addi 1, 1, 64
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %add = add nsw i64 %newval, 1
+  %0 = cmpxchg weak volatile ptr %ptr, i64 %newval, i64 %add monotonic monotonic, align 8
+  %1 = extractvalue { i64, i1 } %0, 1
+  %conv = select i1 %1, i64 55, i64 66
+  ret i64 %conv
+}
+
+define dso_local i64 @atommax8(ptr nocapture noundef %ptr, i64 noundef %val) local_unnamed_addr #0 {
+; CHECK-LABEL: atommax8:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB7_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    ldarx 5, 0, 3
+; CHECK-NEXT:    cmpd 4, 5
+; CHECK-NEXT:    ble 0, .LBB7_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stdcx. 4, 0, 3
+; CHECK-NEXT:    bne 0, .LBB7_1
+; CHECK-NEXT:  .LBB7_3: # %entry
+; CHECK-NEXT:    cmpd 5, 4
+; CHECK-NEXT:    li 3, 55
+; CHECK-NEXT:    li 4, 66
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    iselgt 3, 4, 3
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: atommax8:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    mflr 0
+; AIX32-NEXT:    stw 0, 8(1)
+; AIX32-NEXT:    stwu 1, -80(1)
+; AIX32-NEXT:    lwz 9, 4(3)
+; AIX32-NEXT:    lwz 10, 0(3)
+; AIX32-NEXT:    stw 28, 64(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 29, 68(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 30, 72(1) # 4-byte Folded Spill
+; AIX32-NEXT:    stw 31, 76(1) # 4-byte Folded Spill
+; AIX32-NEXT:    mr 31, 5
+; AIX32-NEXT:    mr 29, 3
+; AIX32-NEXT:    mr 30, 4
+; AIX32-NEXT:    addi 28, 1, 56
+; AIX32-NEXT:    .align 4
+; AIX32-NEXT:  L..BB7_1: # %atomicrmw.start
+; AIX32-NEXT:    #
+; AIX32-NEXT:    cmplw 10, 30
+; AIX32-NEXT:    cmpw 1, 10, 30
+; AIX32-NEXT:    mr 3, 29
+; AIX32-NEXT:    mr 4, 28
+; AIX32-NEXT:    crandc 20, 5, 2
+; AIX32-NEXT:    cmplw 1, 9, 31
+; AIX32-NEXT:    li 7, 5
+; AIX32-NEXT:    li 8, 5
+; AIX32-NEXT:    crand 21, 2, 5
+; AIX32-NEXT:    stw 10, 56(1)
+; AIX32-NEXT:    stw 9, 60(1)
+; AIX32-NEXT:    cror 20, 21, 20
+; AIX32-NEXT:    isel 5, 10, 30, 20
+; AIX32-NEXT:    isel 6, 9, 31, 20
+; AIX32-NEXT:    bl .__atomic_compare_exchange_8[PR]
+; AIX32-NEXT:    nop
+; AIX32-NEXT:    lwz 9, 60(1)
+; AIX32-NEXT:    lwz 10, 56(1)
+; AIX32-NEXT:    cmplwi 3, 0
+; AIX32-NEXT:    beq 0, L..BB7_1
+; AIX32-NEXT:  # %bb.2: # %atomicrmw.end
+; AIX32-NEXT:    cmplw 10, 30
+; AIX32-NEXT:    cmpw 1, 10, 30
+; AIX32-NEXT:    li 3, 55
+; AIX32-NEXT:    li 4, 66
+; AIX32-NEXT:    crandc 20, 5, 2
+; AIX32-NEXT:    cmplw 1, 9, 31
+; AIX32-NEXT:    lwz 31, 76(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 30, 72(1) # 4-byte Folded Reload
+; AIX32-NEXT:    crand 21, 2, 5
+; AIX32-NEXT:    lwz 29, 68(1) # 4-byte Folded Reload
+; AIX32-NEXT:    lwz 28, 64(1) # 4-byte Folded Reload
+; AIX32-NEXT:    cror 20, 21, 20
+; AIX32-NEXT:    isel 4, 4, 3, 20
+; AIX32-NEXT:    li 3, 0
+; AIX32-NEXT:    addi 1, 1, 80
+; AIX32-NEXT:    lwz 0, 8(1)
+; AIX32-NEXT:    mtlr 0
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw max ptr %ptr, i64 %val seq_cst, align 8
+  %cmp.not = icmp sgt i64 %0, %val
+  %conv = select i1 %cmp.not, i64 66, i64 55
+  ret i64 %conv
+}
+
+define dso_local signext i32 @atommax4(ptr nocapture noundef %ptr, i32 noundef signext %val) local_unnamed_addr #0 {
+; CHECK-LABEL: atommax4:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB8_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lwarx 5, 0, 3
+; CHECK-NEXT:    cmpw 4, 5
+; CHECK-NEXT:    ble 0, .LBB8_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stwcx. 4, 0, 3
+; CHECK-NEXT:    bne 0, .LBB8_1
+; CHECK-NEXT:  .LBB8_3: # %entry
+; CHECK-NEXT:    cmpw 5, 4
+; CHECK-NEXT:    li 3, 55
+; CHECK-NEXT:    li 4, 66
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    iselgt 3, 4, 3
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: atommax4:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    sync
+; AIX32-NEXT:  L..BB8_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 5, 0, 3
+; AIX32-NEXT:    cmpw 4, 5
+; AIX32-NEXT:    ble 0, L..BB8_3
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    stwcx. 4, 0, 3
+; AIX32-NEXT:    bne 0, L..BB8_1
+; AIX32-NEXT:  L..BB8_3: # %entry
+; AIX32-NEXT:    cmpw 5, 4
+; AIX32-NEXT:    li 3, 55
+; AIX32-NEXT:    li 4, 66
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    iselgt 3, 4, 3
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw max ptr %ptr, i32 %val seq_cst, align 4
+  %cmp.not = icmp sgt i32 %0, %val
+  %cond = select i1 %cmp.not, i32 66, i32 55
+  ret i32 %cond
+}
+
+define dso_local signext i16 @atommax2(ptr nocapture noundef %ptr, i16 noundef signext %val) local_unnamed_addr #0 {
+; CHECK-LABEL: atommax2:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB9_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lharx 5, 0, 3
+; CHECK-NEXT:    extsh 5, 5
+; CHECK-NEXT:    cmpw 4, 5
+; CHECK-NEXT:    ble 0, .LBB9_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    sthcx. 4, 0, 3
+; CHECK-NEXT:    bne 0, .LBB9_1
+; CHECK-NEXT:  .LBB9_3: # %entry
+; CHECK-NEXT:    cmpw 5, 4
+; CHECK-NEXT:    li 3, 55
+; CHECK-NEXT:    li 4, 66
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    iselgt 3, 4, 3
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: atommax2:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    li 6, 0
+; AIX32-NEXT:    rlwinm 5, 3, 3, 27, 27
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 5, 5, 16
+; AIX32-NEXT:    ori 6, 6, 65535
+; AIX32-NEXT:    slw 7, 4, 5
+; AIX32-NEXT:    slw 6, 6, 5
+; AIX32-NEXT:    rlwinm 3, 3, 0, 0, 29
+; AIX32-NEXT:    and 7, 7, 6
+; AIX32-NEXT:  L..BB9_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 8, 0, 3
+; AIX32-NEXT:    and 9, 8, 6
+; AIX32-NEXT:    srw 9, 9, 5
+; AIX32-NEXT:    extsh 9, 9
+; AIX32-NEXT:    cmpw 4, 9
+; AIX32-NEXT:    ble 0, L..BB9_3
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 9, 8, 6
+; AIX32-NEXT:    or 9, 7, 9
+; AIX32-NEXT:    stwcx. 9, 0, 3
+; AIX32-NEXT:    bne 0, L..BB9_1
+; AIX32-NEXT:  L..BB9_3: # %entry
+; AIX32-NEXT:    srw 3, 8, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 16
+; AIX32-NEXT:    extsh 3, 3
+; AIX32-NEXT:    cmpw 3, 4
+; AIX32-NEXT:    li 3, 55
+; AIX32-NEXT:    li 4, 66
+; AIX32-NEXT:    iselgt 3, 4, 3
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw max ptr %ptr, i16 %val seq_cst, align 2
+  %cmp.not = icmp sgt i16 %0, %val
+  %conv3 = select i1 %cmp.not, i16 66, i16 55
+  ret i16 %conv3
+}
+
+define dso_local zeroext i8 @atommax1(ptr nocapture noundef %ptr, i8 noundef zeroext %val) local_unnamed_addr #0 {
+; CHECK-LABEL: atommax1:
+; CHECK:       # %bb.0: # %entry
+; CHECK-NEXT:    sync
+; CHECK-NEXT:  .LBB10_1: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    lbarx 5, 0, 3
+; CHECK-NEXT:    cmplw 4, 5
+; CHECK-NEXT:    ble 0, .LBB10_3
+; CHECK-NEXT:  # %bb.2: # %entry
+; CHECK-NEXT:    #
+; CHECK-NEXT:    stbcx. 4, 0, 3
+; CHECK-NEXT:    bne 0, .LBB10_1
+; CHECK-NEXT:  .LBB10_3: # %entry
+; CHECK-NEXT:    cmplw 5, 4
+; CHECK-NEXT:    li 3, 55
+; CHECK-NEXT:    li 4, 66
+; CHECK-NEXT:    lwsync
+; CHECK-NEXT:    iselgt 3, 4, 3
+; CHECK-NEXT:    blr
+;
+; AIX32-LABEL: atommax1:
+; AIX32:       # %bb.0: # %entry
+; AIX32-NEXT:    rlwinm 5, 3, 3, 27, 28
+; AIX32-NEXT:    li 7, 255
+; AIX32-NEXT:    sync
+; AIX32-NEXT:    xori 5, 5, 24
+; AIX32-NEXT:    rlwinm 3, 3, 0, 0, 29
+; AIX32-NEXT:    slw 6, 4, 5
+; AIX32-NEXT:    slw 7, 7, 5
+; AIX32-NEXT:    and 8, 6, 7
+; AIX32-NEXT:  L..BB10_1: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    lwarx 9, 0, 3
+; AIX32-NEXT:    and 10, 9, 7
+; AIX32-NEXT:    cmplw 6, 10
+; AIX32-NEXT:    ble 0, L..BB10_3
+; AIX32-NEXT:  # %bb.2: # %entry
+; AIX32-NEXT:    #
+; AIX32-NEXT:    andc 10, 9, 7
+; AIX32-NEXT:    or 10, 8, 10
+; AIX32-NEXT:    stwcx. 10, 0, 3
+; AIX32-NEXT:    bne 0, L..BB10_1
+; AIX32-NEXT:  L..BB10_3: # %entry
+; AIX32-NEXT:    srw 3, 9, 5
+; AIX32-NEXT:    lwsync
+; AIX32-NEXT:    clrlwi 3, 3, 24
+; AIX32-NEXT:    cmplw 3, 4
+; AIX32-NEXT:    li 3, 55
+; AIX32-NEXT:    li 4, 66
+; AIX32-NEXT:    iselgt 3, 4, 3
+; AIX32-NEXT:    blr
+entry:
+  %0 = atomicrmw umax ptr %ptr, i8 %val seq_cst, align 1
+  %cmp.not = icmp ugt i8 %0, %val
+  %conv3 = select i1 %cmp.not, i8 66, i8 55
+  ret i8 %conv3
+}


        


More information about the llvm-commits mailing list