| ; 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' |
| |
| @sc = dso_local global i8 0, align 1 |
| @uc = dso_local global i8 0, align 1 |
| @ss = dso_local global i16 0, align 2 |
| @us = dso_local global i16 0, align 2 |
| @si = dso_local global i32 0, align 4 |
| @ui = dso_local global i32 0, align 4 |
| @sll = dso_local global i64 0, align 8 |
| @ull = dso_local global i64 0, align 8 |
| @u128 = dso_local global i128 0, align 16 |
| @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@toc@ha |
| ; CHECK-NEXT: std 26, -48(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std 27, -40(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: addi 4, 3, sc@toc@l |
| ; 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: li 3, 1 |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 5, 5, uc@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 6, 6, ss@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 8, 7, us@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 9, 7, si@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 10, 7, ui@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 11, 7, sll@toc@l |
| ; CHECK-NEXT: li 7, 1 |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 12, 12, ull@toc@l |
| ; 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: addis 30, 2, u128@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 0, 30, u128@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: addis 29, 2, s128@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: addi 0, 29, s128@toc@l |
| ; CHECK-NEXT: sync |
| ; 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: stwu 1, -160(1) |
| ; AIX32-NEXT: lwz 3, L..C0(2) # @sc |
| ; AIX32-NEXT: stw 0, 168(1) |
| ; AIX32-NEXT: rlwinm 4, 3, 3, 27, 28 |
| ; 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: rlwinm 28, 3, 0, 0, 29 |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: xori 26, 4, 24 |
| ; AIX32-NEXT: stw 16, 96(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 17, 100(1) # 4-byte Folded Spill |
| ; 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: sync |
| ; AIX32-NEXT: slw 29, 15, 26 |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; 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: lwsync |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 4, 3, 3, 27, 27 |
| ; AIX32-NEXT: rlwinm 25, 3, 0, 0, 29 |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: xori 22, 4, 16 |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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: lwsync |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 4, 3, 3, 27, 27 |
| ; AIX32-NEXT: rlwinm 23, 3, 0, 0, 29 |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: xori 21, 4, 16 |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 16, 15, 21 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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: lwsync |
| ; AIX32-NEXT: lwz 20, L..C4(2) # @si |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB0_9: # %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_9 |
| ; AIX32-NEXT: # %bb.10: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 19, L..C5(2) # @ui |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB0_11: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 19 |
| ; AIX32-NEXT: addi 3, 3, 1 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_11 |
| ; AIX32-NEXT: # %bb.12: # %entry |
| ; AIX32-NEXT: lwz 31, L..C6(2) # @sll |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; 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: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: li 6, 5 |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 24 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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, 20 |
| ; AIX32-NEXT: sub 3, 3, 15 |
| ; AIX32-NEXT: stwcx. 3, 0, 20 |
| ; 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, 19 |
| ; AIX32-NEXT: sub 3, 3, 15 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_23 |
| ; AIX32-NEXT: # %bb.24: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: bl .__atomic_fetch_sub_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 24 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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, 20 |
| ; AIX32-NEXT: ori 3, 3, 1 |
| ; AIX32-NEXT: stwcx. 3, 0, 20 |
| ; 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, 19 |
| ; AIX32-NEXT: ori 3, 3, 1 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_35 |
| ; AIX32-NEXT: # %bb.36: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: bl .__atomic_fetch_or_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 24 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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, 20 |
| ; AIX32-NEXT: xori 3, 3, 1 |
| ; AIX32-NEXT: stwcx. 3, 0, 20 |
| ; 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, 19 |
| ; AIX32-NEXT: xori 3, 3, 1 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_47 |
| ; AIX32-NEXT: # %bb.48: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: bl .__atomic_fetch_xor_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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 4, 8(31) |
| ; AIX32-NEXT: lwz 6, 4(31) |
| ; AIX32-NEXT: lwz 7, 0(31) |
| ; AIX32-NEXT: .align 4 |
| ; AIX32-NEXT: L..BB0_49: # %atomicrmw.start |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: xori 3, 5, 1 |
| ; AIX32-NEXT: stw 7, 72(1) |
| ; AIX32-NEXT: stw 7, 56(1) |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: stw 3, 68(1) |
| ; AIX32-NEXT: li 3, 16 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: stw 6, 76(1) |
| ; AIX32-NEXT: stw 4, 80(1) |
| ; AIX32-NEXT: stw 5, 84(1) |
| ; AIX32-NEXT: stw 4, 64(1) |
| ; AIX32-NEXT: stw 6, 60(1) |
| ; AIX32-NEXT: mr 4, 31 |
| ; AIX32-NEXT: mr 5, 30 |
| ; AIX32-NEXT: mr 6, 29 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 5, 84(1) |
| ; AIX32-NEXT: lwz 4, 80(1) |
| ; AIX32-NEXT: lwz 6, 76(1) |
| ; AIX32-NEXT: lwz 7, 72(1) |
| ; AIX32-NEXT: cmplwi 3, 0 |
| ; 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 4, 8(31) |
| ; AIX32-NEXT: lwz 6, 4(31) |
| ; AIX32-NEXT: lwz 7, 0(31) |
| ; AIX32-NEXT: .align 4 |
| ; AIX32-NEXT: L..BB0_51: # %atomicrmw.start2 |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: xori 3, 5, 1 |
| ; AIX32-NEXT: stw 7, 72(1) |
| ; AIX32-NEXT: stw 7, 56(1) |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: stw 3, 68(1) |
| ; AIX32-NEXT: li 3, 16 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: stw 6, 76(1) |
| ; AIX32-NEXT: stw 4, 80(1) |
| ; AIX32-NEXT: stw 5, 84(1) |
| ; AIX32-NEXT: stw 4, 64(1) |
| ; AIX32-NEXT: stw 6, 60(1) |
| ; AIX32-NEXT: mr 4, 31 |
| ; AIX32-NEXT: mr 5, 30 |
| ; AIX32-NEXT: mr 6, 29 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 5, 84(1) |
| ; AIX32-NEXT: lwz 4, 80(1) |
| ; AIX32-NEXT: lwz 6, 76(1) |
| ; AIX32-NEXT: lwz 7, 72(1) |
| ; AIX32-NEXT: cmplwi 3, 0 |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 24 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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, 21 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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, 20 |
| ; AIX32-NEXT: nand 3, 29, 3 |
| ; AIX32-NEXT: stwcx. 3, 0, 20 |
| ; 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, 19 |
| ; AIX32-NEXT: nand 3, 29, 3 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_63 |
| ; AIX32-NEXT: # %bb.64: # %atomicrmw.end1 |
| ; AIX32-NEXT: lwz 31, L..C6(2) # @sll |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: li 6, 5 |
| ; 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: mr 3, 30 |
| ; AIX32-NEXT: li 6, 5 |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 24 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; 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: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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, 20 |
| ; AIX32-NEXT: and 3, 29, 3 |
| ; AIX32-NEXT: stwcx. 3, 0, 20 |
| ; 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, 19 |
| ; AIX32-NEXT: and 3, 29, 3 |
| ; AIX32-NEXT: stwcx. 3, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB0_75 |
| ; AIX32-NEXT: # %bb.76: # %atomicrmw.end1 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: bl .__atomic_fetch_and_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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@toc@ha |
| ; CHECK-NEXT: std 22, -80(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std 23, -72(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: li 3, 11 |
| ; CHECK-NEXT: std 24, -64(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: std 25, -56(1) # 8-byte Folded Spill |
| ; CHECK-NEXT: addi 6, 4, sc@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@toc@l(4) |
| ; CHECK-NEXT: addis 5, 2, uc@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 8, 5, uc@toc@l |
| ; 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@toc@l(5) |
| ; CHECK-NEXT: addis 7, 2, ss@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 10, 7, ss@toc@l |
| ; 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@toc@l(7) |
| ; CHECK-NEXT: addis 9, 2, us@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 0, 9, us@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sth 11, us@toc@l(9) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 29, 12, si@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 11, si@toc@l(12) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 27, 30, ui@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 11, ui@toc@l(30) |
| ; CHECK-NEXT: li 11, 11 |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 25, 28, sll@toc@l |
| ; 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@toc@l(28) |
| ; CHECK-NEXT: addis 26, 2, ull@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 24, 26, ull@toc@l |
| ; 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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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@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: stwu 1, -144(1) |
| ; AIX32-NEXT: lwz 4, L..C0(2) # @sc |
| ; AIX32-NEXT: stw 0, 152(1) |
| ; AIX32-NEXT: li 7, 11 |
| ; AIX32-NEXT: stw 26, 120(1) # 4-byte Folded Spill |
| ; 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: rlwinm 3, 4, 3, 27, 28 |
| ; AIX32-NEXT: stw 16, 80(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 17, 84(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 18, 88(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: xori 26, 3, 24 |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; 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: sync |
| ; AIX32-NEXT: rlwinm 25, 4, 0, 0, 29 |
| ; AIX32-NEXT: slw 24, 7, 26 |
| ; AIX32-NEXT: stw 4, 64(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: L..BB1_1: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: add 5, 24, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_1 |
| ; AIX32-NEXT: # %bb.2: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 27, L..C1(2) # @uc |
| ; AIX32-NEXT: lwz 4, 64(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: rlwinm 21, 27, 0, 0, 29 |
| ; AIX32-NEXT: stb 3, 0(4) |
| ; AIX32-NEXT: rlwinm 3, 27, 3, 27, 28 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: xori 22, 3, 24 |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: slw 20, 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, 20, 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: srw 3, 4, 22 |
| ; AIX32-NEXT: lwz 23, L..C2(2) # @ss |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: rlwinm 17, 23, 0, 0, 29 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 3, 23, 3, 27, 27 |
| ; AIX32-NEXT: xori 18, 3, 16 |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: ori 3, 3, 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: srw 3, 4, 18 |
| ; AIX32-NEXT: lwz 19, L..C3(2) # @us |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: rlwinm 14, 19, 0, 0, 29 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 3, 19, 3, 27, 27 |
| ; AIX32-NEXT: xori 15, 3, 16 |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 13, 7, 15 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_7: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: add 5, 13, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; AIX32-NEXT: bne 0, L..BB1_7 |
| ; AIX32-NEXT: # %bb.8: # %entry |
| ; AIX32-NEXT: srw 3, 4, 15 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 29, L..C4(2) # @si |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_9: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: addi 4, 3, 11 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_9 |
| ; AIX32-NEXT: # %bb.10: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: lwz 28, L..C5(2) # @ui |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_11: # %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_11 |
| ; AIX32-NEXT: # %bb.12: # %entry |
| ; AIX32-NEXT: lwz 31, L..C6(2) # @sll |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; 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: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_add_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; AIX32-NEXT: L..BB1_13: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: sub 5, 4, 24 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_13 |
| ; AIX32-NEXT: # %bb.14: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 22 |
| ; AIX32-NEXT: L..BB1_15: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 21 |
| ; AIX32-NEXT: sub 5, 4, 20 |
| ; 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: lwsync |
| ; AIX32-NEXT: li 7, 11 |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 18 |
| ; 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_19: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: sub 5, 4, 13 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; 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(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_21: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: sub 4, 3, 7 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_21 |
| ; AIX32-NEXT: # %bb.22: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_23: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 28 |
| ; AIX32-NEXT: sub 4, 3, 7 |
| ; AIX32-NEXT: stwcx. 4, 0, 28 |
| ; AIX32-NEXT: bne 0, L..BB1_23 |
| ; AIX32-NEXT: # %bb.24: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_sub_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_sub_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; AIX32-NEXT: L..BB1_25: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: or 5, 24, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_25 |
| ; AIX32-NEXT: # %bb.26: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 22 |
| ; AIX32-NEXT: L..BB1_27: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 21 |
| ; AIX32-NEXT: or 5, 20, 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 18 |
| ; 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_31: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: or 5, 13, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; 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(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_33: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: ori 4, 3, 11 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_33 |
| ; AIX32-NEXT: # %bb.34: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_35: # %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_35 |
| ; AIX32-NEXT: # %bb.36: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_or_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_or_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; AIX32-NEXT: L..BB1_37: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: xor 5, 24, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_37 |
| ; AIX32-NEXT: # %bb.38: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 22 |
| ; AIX32-NEXT: L..BB1_39: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 21 |
| ; AIX32-NEXT: xor 5, 20, 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 18 |
| ; 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_43: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: xor 5, 13, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; 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(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_45: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: xori 4, 3, 11 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_45 |
| ; AIX32-NEXT: # %bb.46: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_47: # %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_47 |
| ; AIX32-NEXT: # %bb.48: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_xor_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_xor_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; AIX32-NEXT: L..BB1_49: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: nand 5, 24, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_49 |
| ; AIX32-NEXT: # %bb.50: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 7, 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: sync |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: slw 3, 3, 22 |
| ; AIX32-NEXT: L..BB1_51: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 21 |
| ; AIX32-NEXT: nand 5, 20, 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 18 |
| ; 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_55: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: nand 5, 13, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; 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(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_57: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: nand 4, 7, 3 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_57 |
| ; AIX32-NEXT: # %bb.58: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_59: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 28 |
| ; AIX32-NEXT: nand 4, 7, 3 |
| ; AIX32-NEXT: stwcx. 4, 0, 28 |
| ; AIX32-NEXT: bne 0, L..BB1_59 |
| ; AIX32-NEXT: # %bb.60: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_nand_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_nand_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 3, 3, 26 |
| ; AIX32-NEXT: L..BB1_61: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: and 5, 24, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB1_61 |
| ; AIX32-NEXT: # %bb.62: # %entry |
| ; AIX32-NEXT: srw 3, 4, 26 |
| ; AIX32-NEXT: lwsync |
| ; 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: sync |
| ; AIX32-NEXT: slw 3, 3, 22 |
| ; AIX32-NEXT: L..BB1_63: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 21 |
| ; AIX32-NEXT: and 5, 20, 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: lwsync |
| ; AIX32-NEXT: li 7, 11 |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 18 |
| ; 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: lwsync |
| ; AIX32-NEXT: clrlwi 3, 3, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: li 3, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: ori 3, 3, 65535 |
| ; AIX32-NEXT: slw 3, 3, 15 |
| ; AIX32-NEXT: L..BB1_67: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 14 |
| ; AIX32-NEXT: and 5, 13, 4 |
| ; AIX32-NEXT: andc 6, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: or 5, 5, 6 |
| ; AIX32-NEXT: stwcx. 5, 0, 14 |
| ; 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(19) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_69: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 29 |
| ; AIX32-NEXT: and 4, 7, 3 |
| ; AIX32-NEXT: stwcx. 4, 0, 29 |
| ; AIX32-NEXT: bne 0, L..BB1_69 |
| ; AIX32-NEXT: # %bb.70: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB1_71: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 3, 0, 28 |
| ; AIX32-NEXT: and 4, 7, 3 |
| ; AIX32-NEXT: stwcx. 4, 0, 28 |
| ; AIX32-NEXT: bne 0, L..BB1_71 |
| ; AIX32-NEXT: # %bb.72: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(28) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_and_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 11 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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@toc@ha |
| ; CHECK-NEXT: addis 5, 2, sc@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: lbz 6, uc@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: addi 4, 3, uc@toc@l |
| ; CHECK-NEXT: addi 7, 5, sc@toc@l |
| ; 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@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 8, uc@toc@l(3) |
| ; CHECK-NEXT: clrlwi 8, 8, 24 |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 9, 6, ss@toc@l |
| ; 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: addis 8, 2, us@toc@ha |
| ; CHECK-NEXT: sth 10, ss@toc@l(6) |
| ; CHECK-NEXT: lbz 10, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 11, 8, us@toc@l |
| ; 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: addis 10, 2, si@toc@ha |
| ; CHECK-NEXT: sth 12, us@toc@l(8) |
| ; CHECK-NEXT: lbz 12, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 0, 10, si@toc@l |
| ; 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: addis 12, 2, ui@toc@ha |
| ; CHECK-NEXT: stw 30, si@toc@l(10) |
| ; CHECK-NEXT: lbz 30, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 29, 12, ui@toc@l |
| ; 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: addis 30, 2, sll@toc@ha |
| ; CHECK-NEXT: stw 28, ui@toc@l(12) |
| ; CHECK-NEXT: lbz 28, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 27, 30, sll@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: std 26, sll@toc@l(30) |
| ; CHECK-NEXT: lbz 25, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 26, 28, ull@toc@l |
| ; 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@toc@l(28) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(5) |
| ; CHECK-NEXT: lbz 25, uc@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@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@toc@l(6) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(8) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(10) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(12) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(30) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(28) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(5) |
| ; CHECK-NEXT: lbz 25, uc@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@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@toc@l(6) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(8) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(10) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(12) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(30) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(28) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(5) |
| ; CHECK-NEXT: lbz 25, uc@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@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@toc@l(6) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(8) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(10) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(12) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(30) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(28) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(5) |
| ; CHECK-NEXT: lbz 25, uc@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@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@toc@l(6) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(8) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(10) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(12) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(30) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(28) |
| ; CHECK-NEXT: addis 24, 2, u128@toc@ha |
| ; CHECK-NEXT: li 22, 0 |
| ; CHECK-NEXT: lbz 25, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 23, 24, u128@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: std 25, u128@toc@l(24) |
| ; CHECK-NEXT: addis 24, 2, s128@toc@ha |
| ; CHECK-NEXT: lbz 25, uc@toc@l(3) |
| ; CHECK-NEXT: std 21, 8(23) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 23, 24, s128@toc@l |
| ; CHECK-NEXT: .LBB2_83: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lqarx 18, 0, 23 |
| ; CHECK-NEXT: nand 17, 25, 19 |
| ; CHECK-NEXT: nand 16, 22, 18 |
| ; CHECK-NEXT: stqcx. 16, 0, 23 |
| ; CHECK-NEXT: bne 0, .LBB2_83 |
| ; CHECK-NEXT: # %bb.84: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: std 21, 8(23) |
| ; CHECK-NEXT: nand 25, 19, 25 |
| ; CHECK-NEXT: std 25, s128@toc@l(24) |
| ; CHECK-NEXT: lbz 25, uc@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@toc@l(5) |
| ; CHECK-NEXT: lbz 7, uc@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@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@toc@l(6) |
| ; CHECK-NEXT: lbz 4, uc@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@toc@l(8) |
| ; CHECK-NEXT: lbz 4, uc@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@toc@l(10) |
| ; CHECK-NEXT: lbz 4, uc@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@toc@l(12) |
| ; CHECK-NEXT: lbz 4, uc@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@toc@l(30) |
| ; CHECK-NEXT: lbz 3, uc@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@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: stwu 1, -176(1) |
| ; AIX32-NEXT: stw 0, 184(1) |
| ; AIX32-NEXT: stw 27, 156(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: lwz 27, L..C0(2) # @sc |
| ; AIX32-NEXT: stw 26, 152(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: lwz 26, L..C1(2) # @uc |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: rlwinm 4, 27, 3, 27, 28 |
| ; AIX32-NEXT: stw 24, 144(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: stw 15, 108(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: xori 24, 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 23, 140(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 25, 148(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: li 17, -1 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 22, 27, 0, 0, 29 |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: L..BB2_1: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 22 |
| ; 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, 22 |
| ; AIX32-NEXT: bne 0, L..BB2_1 |
| ; AIX32-NEXT: # %bb.2: # %entry |
| ; AIX32-NEXT: srw 4, 6, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: rlwinm 19, 26, 0, 0, 29 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: add 3, 4, 3 |
| ; AIX32-NEXT: rlwinm 4, 26, 3, 27, 28 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: xori 21, 4, 24 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: srw 4, 6, 21 |
| ; AIX32-NEXT: lwz 23, L..C2(2) # @ss |
| ; AIX32-NEXT: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: rlwinm 16, 23, 0, 0, 29 |
| ; AIX32-NEXT: add 3, 4, 3 |
| ; AIX32-NEXT: rlwinm 4, 23, 3, 27, 27 |
| ; AIX32-NEXT: xori 18, 4, 16 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: sync |
| ; 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, 16 |
| ; 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, 16 |
| ; 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: rlwinm 14, 20, 0, 0, 29 |
| ; AIX32-NEXT: add 3, 4, 3 |
| ; AIX32-NEXT: rlwinm 4, 20, 3, 27, 27 |
| ; AIX32-NEXT: xori 15, 4, 16 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: slw 4, 3, 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: lwsync |
| ; AIX32-NEXT: stw 4, 0(13) |
| ; AIX32-NEXT: lwz 25, L..C5(2) # @ui |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: L..BB2_11: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 4, 0, 25 |
| ; AIX32-NEXT: add 4, 3, 4 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; 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(25) |
| ; AIX32-NEXT: lbz 30, 0(26) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: li 28, 0 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: mr 5, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_add_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: addc 4, 4, 30 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: lwz 30, L..C7(2) # @ull |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: addze 3, 3 |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_add_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: addc 4, 4, 29 |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: addze 3, 3 |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; AIX32-NEXT: L..BB2_13: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 22 |
| ; 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, 22 |
| ; AIX32-NEXT: bne 0, L..BB2_13 |
| ; AIX32-NEXT: # %bb.14: # %entry |
| ; AIX32-NEXT: srw 4, 6, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: sub 3, 4, 3 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: sub 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 18 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: slw 4, 3, 18 |
| ; AIX32-NEXT: L..BB2_17: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 16 |
| ; 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, 16 |
| ; 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: ori 5, 5, 65535 |
| ; AIX32-NEXT: sub 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 15 |
| ; 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, 25 |
| ; AIX32-NEXT: sub 4, 4, 3 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB2_23 |
| ; AIX32-NEXT: # %bb.24: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_sub_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: subc 4, 4, 29 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: subfe 3, 28, 3 |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_sub_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: subc 4, 4, 29 |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: subfe 3, 28, 3 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; AIX32-NEXT: L..BB2_25: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 22 |
| ; 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, 22 |
| ; AIX32-NEXT: bne 0, L..BB2_25 |
| ; AIX32-NEXT: # %bb.26: # %entry |
| ; AIX32-NEXT: srw 4, 6, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: or 3, 4, 3 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: or 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 18 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: slw 4, 3, 18 |
| ; AIX32-NEXT: L..BB2_29: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 16 |
| ; 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, 16 |
| ; 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 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 15 |
| ; 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, 25 |
| ; AIX32-NEXT: or 4, 3, 4 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB2_35 |
| ; AIX32-NEXT: # %bb.36: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_or_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: or 4, 4, 29 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_or_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: or 3, 4, 29 |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: stw 3, 4(30) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; AIX32-NEXT: L..BB2_37: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 22 |
| ; 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, 22 |
| ; AIX32-NEXT: bne 0, L..BB2_37 |
| ; AIX32-NEXT: # %bb.38: # %entry |
| ; AIX32-NEXT: srw 4, 6, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: xor 3, 4, 3 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: xor 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 18 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: slw 4, 3, 18 |
| ; AIX32-NEXT: L..BB2_41: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 16 |
| ; 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, 16 |
| ; 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 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 15 |
| ; 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, 25 |
| ; AIX32-NEXT: xor 4, 3, 4 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB2_47 |
| ; AIX32-NEXT: # %bb.48: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_xor_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: xor 4, 4, 29 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_fetch_xor_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: xor 4, 4, 29 |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: L..BB2_49: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 22 |
| ; 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, 22 |
| ; AIX32-NEXT: bne 0, L..BB2_49 |
| ; AIX32-NEXT: # %bb.50: # %entry |
| ; AIX32-NEXT: srw 4, 6, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: nand 3, 4, 3 |
| ; AIX32-NEXT: stb 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: nand 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 18 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: clrlwi 3, 3, 24 |
| ; AIX32-NEXT: slw 4, 3, 18 |
| ; AIX32-NEXT: L..BB2_53: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 16 |
| ; 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, 16 |
| ; 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 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: sth 3, 0(23) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 15 |
| ; 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 23, 56(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 27, 60(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, 25 |
| ; AIX32-NEXT: nand 4, 3, 4 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB2_59 |
| ; AIX32-NEXT: # %bb.60: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_nand_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: nand 3, 4, 29 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 4(31) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: stw 17, 0(31) |
| ; AIX32-NEXT: bl .__atomic_fetch_nand_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: nand 3, 4, 29 |
| ; AIX32-NEXT: lwz 29, L..C8(2) # @u128 |
| ; AIX32-NEXT: lbz 23, 0(26) |
| ; AIX32-NEXT: addi 28, 1, 80 |
| ; AIX32-NEXT: addi 27, 1, 64 |
| ; AIX32-NEXT: stw 17, 0(30) |
| ; AIX32-NEXT: lwz 4, 12(29) |
| ; AIX32-NEXT: lwz 5, 8(29) |
| ; AIX32-NEXT: lwz 6, 4(29) |
| ; AIX32-NEXT: lwz 7, 0(29) |
| ; AIX32-NEXT: stw 3, 4(30) |
| ; AIX32-NEXT: .align 4 |
| ; AIX32-NEXT: L..BB2_61: # %atomicrmw.start |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: and 3, 4, 23 |
| ; AIX32-NEXT: stw 7, 80(1) |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: xor 3, 3, 17 |
| ; AIX32-NEXT: stw 6, 84(1) |
| ; AIX32-NEXT: stw 5, 88(1) |
| ; AIX32-NEXT: stw 4, 92(1) |
| ; AIX32-NEXT: mr 4, 29 |
| ; AIX32-NEXT: mr 5, 28 |
| ; AIX32-NEXT: mr 6, 27 |
| ; AIX32-NEXT: stw 3, 76(1) |
| ; AIX32-NEXT: li 3, 16 |
| ; AIX32-NEXT: stw 17, 72(1) |
| ; AIX32-NEXT: stw 17, 68(1) |
| ; AIX32-NEXT: stw 17, 64(1) |
| ; AIX32-NEXT: bl .__atomic_compare_exchange[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 4, 92(1) |
| ; AIX32-NEXT: lwz 5, 88(1) |
| ; AIX32-NEXT: lwz 6, 84(1) |
| ; AIX32-NEXT: lwz 7, 80(1) |
| ; AIX32-NEXT: cmplwi 3, 0 |
| ; AIX32-NEXT: beq 0, L..BB2_61 |
| ; AIX32-NEXT: # %bb.62: # %atomicrmw.end |
| ; AIX32-NEXT: and 3, 4, 23 |
| ; AIX32-NEXT: stw 17, 0(29) |
| ; AIX32-NEXT: lbz 23, 0(26) |
| ; AIX32-NEXT: stw 17, 4(29) |
| ; AIX32-NEXT: stw 17, 8(29) |
| ; AIX32-NEXT: xor 3, 3, 17 |
| ; AIX32-NEXT: addi 28, 1, 80 |
| ; AIX32-NEXT: addi 27, 1, 64 |
| ; AIX32-NEXT: stw 3, 12(29) |
| ; AIX32-NEXT: lwz 29, L..C9(2) # @s128 |
| ; AIX32-NEXT: lwz 4, 12(29) |
| ; AIX32-NEXT: lwz 5, 8(29) |
| ; AIX32-NEXT: lwz 6, 4(29) |
| ; AIX32-NEXT: lwz 7, 0(29) |
| ; AIX32-NEXT: .align 4 |
| ; AIX32-NEXT: L..BB2_63: # %atomicrmw.start2 |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: and 3, 4, 23 |
| ; AIX32-NEXT: stw 7, 80(1) |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: xor 3, 3, 17 |
| ; AIX32-NEXT: stw 6, 84(1) |
| ; AIX32-NEXT: stw 5, 88(1) |
| ; AIX32-NEXT: stw 4, 92(1) |
| ; AIX32-NEXT: mr 4, 29 |
| ; AIX32-NEXT: mr 5, 28 |
| ; AIX32-NEXT: mr 6, 27 |
| ; AIX32-NEXT: stw 3, 76(1) |
| ; AIX32-NEXT: li 3, 16 |
| ; AIX32-NEXT: stw 17, 72(1) |
| ; AIX32-NEXT: stw 17, 68(1) |
| ; AIX32-NEXT: stw 17, 64(1) |
| ; AIX32-NEXT: bl .__atomic_compare_exchange[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 4, 92(1) |
| ; AIX32-NEXT: lwz 5, 88(1) |
| ; AIX32-NEXT: lwz 6, 84(1) |
| ; AIX32-NEXT: lwz 7, 80(1) |
| ; AIX32-NEXT: cmplwi 3, 0 |
| ; AIX32-NEXT: beq 0, L..BB2_63 |
| ; AIX32-NEXT: # %bb.64: # %atomicrmw.end1 |
| ; AIX32-NEXT: and 3, 4, 23 |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: xor 3, 3, 17 |
| ; AIX32-NEXT: stw 17, 0(29) |
| ; AIX32-NEXT: stw 17, 4(29) |
| ; AIX32-NEXT: stw 17, 8(29) |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: stw 3, 12(29) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 24 |
| ; 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, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: slw 5, 5, 21 |
| ; AIX32-NEXT: and 3, 4, 3 |
| ; AIX32-NEXT: lwz 4, 60(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: stb 3, 0(4) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: lwz 9, 56(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: slw 4, 3, 21 |
| ; 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: li 5, 0 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: and 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 18 |
| ; AIX32-NEXT: stb 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 18 |
| ; AIX32-NEXT: L..BB2_69: # %atomicrmw.end1 |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 16 |
| ; 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, 16 |
| ; 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 3, 4, 3 |
| ; AIX32-NEXT: slw 5, 5, 15 |
| ; AIX32-NEXT: sth 3, 0(9) |
| ; AIX32-NEXT: lbz 3, 0(26) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 4, 3, 15 |
| ; 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, 25 |
| ; AIX32-NEXT: and 4, 3, 4 |
| ; AIX32-NEXT: stwcx. 4, 0, 25 |
| ; AIX32-NEXT: bne 0, L..BB2_75 |
| ; AIX32-NEXT: # %bb.76: # %atomicrmw.end1 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: lbz 29, 0(26) |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: li 28, 0 |
| ; AIX32-NEXT: mr 5, 29 |
| ; AIX32-NEXT: bl .__atomic_fetch_and_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: and 3, 4, 29 |
| ; AIX32-NEXT: stw 28, 0(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 4(31) |
| ; AIX32-NEXT: lbz 31, 0(26) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: mr 5, 31 |
| ; AIX32-NEXT: bl .__atomic_fetch_and_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: and 3, 4, 31 |
| ; AIX32-NEXT: stw 28, 0(30) |
| ; AIX32-NEXT: lwz 31, 172(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: stw 3, 4(30) |
| ; AIX32-NEXT: lwz 30, 168(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@toc@ha |
| ; CHECK-NEXT: addis 4, 2, sc@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: lbz 5, uc@toc@l(3) |
| ; CHECK-NEXT: lbz 8, sc@toc@l(4) |
| ; CHECK-NEXT: addi 6, 3, uc@toc@l |
| ; CHECK-NEXT: addi 0, 4, sc@toc@l |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 7, 0, 0 |
| ; CHECK-NEXT: cmpw 7, 5 |
| ; 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: .LBB3_3: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 7, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 8, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_4: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 5, 0, 6 |
| ; CHECK-NEXT: cmpw 5, 8 |
| ; CHECK-NEXT: bne 0, .LBB3_6 |
| ; CHECK-NEXT: # %bb.5: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 7, 0, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_4 |
| ; CHECK-NEXT: .LBB3_6: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 5, uc@toc@l(3) |
| ; CHECK-NEXT: lbz 7, sc@toc@l(4) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 8, 7 |
| ; CHECK-NEXT: addis 7, 2, ss@toc@ha |
| ; CHECK-NEXT: addi 12, 7, ss@toc@l |
| ; CHECK-NEXT: .LBB3_7: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 9, 0, 12 |
| ; CHECK-NEXT: cmpw 9, 5 |
| ; CHECK-NEXT: bne 0, .LBB3_9 |
| ; CHECK-NEXT: # %bb.8: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 8, 0, 12 |
| ; CHECK-NEXT: bne 0, .LBB3_7 |
| ; CHECK-NEXT: .LBB3_9: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sth 9, ss@toc@l(7) |
| ; CHECK-NEXT: lbz 7, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 5, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 8, 7 |
| ; CHECK-NEXT: addis 7, 2, us@toc@ha |
| ; CHECK-NEXT: addi 11, 7, us@toc@l |
| ; CHECK-NEXT: .LBB3_10: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 9, 0, 11 |
| ; CHECK-NEXT: cmpw 9, 5 |
| ; CHECK-NEXT: bne 0, .LBB3_12 |
| ; CHECK-NEXT: # %bb.11: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 8, 0, 11 |
| ; CHECK-NEXT: bne 0, .LBB3_10 |
| ; CHECK-NEXT: .LBB3_12: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sth 9, us@toc@l(7) |
| ; CHECK-NEXT: lbz 7, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 5, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 8, 7 |
| ; CHECK-NEXT: addis 7, 2, si@toc@ha |
| ; CHECK-NEXT: addi 10, 7, si@toc@l |
| ; CHECK-NEXT: .LBB3_13: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 9, 0, 10 |
| ; CHECK-NEXT: cmpw 9, 5 |
| ; CHECK-NEXT: bne 0, .LBB3_15 |
| ; CHECK-NEXT: # %bb.14: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 8, 0, 10 |
| ; CHECK-NEXT: bne 0, .LBB3_13 |
| ; CHECK-NEXT: .LBB3_15: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 9, si@toc@l(7) |
| ; CHECK-NEXT: lbz 5, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 7, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 8, 5 |
| ; CHECK-NEXT: addis 5, 2, ui@toc@ha |
| ; CHECK-NEXT: addi 9, 5, ui@toc@l |
| ; CHECK-NEXT: .LBB3_16: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 30, 0, 9 |
| ; CHECK-NEXT: cmpw 30, 7 |
| ; CHECK-NEXT: bne 0, .LBB3_18 |
| ; CHECK-NEXT: # %bb.17: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 8, 0, 9 |
| ; CHECK-NEXT: bne 0, .LBB3_16 |
| ; CHECK-NEXT: .LBB3_18: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 30, ui@toc@l(5) |
| ; CHECK-NEXT: addis 30, 2, sll@toc@ha |
| ; CHECK-NEXT: lbz 8, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 7, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 29, 8 |
| ; CHECK-NEXT: addi 8, 30, sll@toc@l |
| ; CHECK-NEXT: .LBB3_19: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 28, 0, 8 |
| ; CHECK-NEXT: cmpd 28, 7 |
| ; CHECK-NEXT: bne 0, .LBB3_21 |
| ; CHECK-NEXT: # %bb.20: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 29, 0, 8 |
| ; CHECK-NEXT: bne 0, .LBB3_19 |
| ; CHECK-NEXT: .LBB3_21: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: addis 29, 2, ull@toc@ha |
| ; CHECK-NEXT: std 28, sll@toc@l(30) |
| ; CHECK-NEXT: lbz 7, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 30, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: extsb 28, 7 |
| ; CHECK-NEXT: addi 7, 29, ull@toc@l |
| ; CHECK-NEXT: .LBB3_22: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 27, 0, 7 |
| ; CHECK-NEXT: cmpd 27, 30 |
| ; CHECK-NEXT: bne 0, .LBB3_24 |
| ; CHECK-NEXT: # %bb.23: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 28, 0, 7 |
| ; CHECK-NEXT: bne 0, .LBB3_22 |
| ; CHECK-NEXT: .LBB3_24: # %entry |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: std 27, ull@toc@l(29) |
| ; CHECK-NEXT: lbz 30, uc@toc@l(3) |
| ; CHECK-NEXT: lbz 29, sc@toc@l(4) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_25: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 28, 0, 0 |
| ; CHECK-NEXT: cmpw 28, 30 |
| ; CHECK-NEXT: bne 0, .LBB3_27 |
| ; CHECK-NEXT: # %bb.26: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 29, 0, 0 |
| ; CHECK-NEXT: bne 0, .LBB3_25 |
| ; CHECK-NEXT: .LBB3_27: # %entry |
| ; CHECK-NEXT: xor 0, 28, 30 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 30, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 0, 0 |
| ; CHECK-NEXT: srwi 0, 0, 5 |
| ; CHECK-NEXT: stw 0, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 0, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_28: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 29, 0, 6 |
| ; CHECK-NEXT: cmpw 29, 0 |
| ; CHECK-NEXT: bne 0, .LBB3_30 |
| ; CHECK-NEXT: # %bb.29: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 30, 0, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_28 |
| ; CHECK-NEXT: .LBB3_30: # %entry |
| ; CHECK-NEXT: xor 6, 29, 0 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 0, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 6, 6 |
| ; CHECK-NEXT: extsb 0, 0 |
| ; CHECK-NEXT: srwi 6, 6, 5 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_31: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 30, 0, 12 |
| ; CHECK-NEXT: cmpw 30, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_33 |
| ; CHECK-NEXT: # %bb.32: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 0, 0, 12 |
| ; CHECK-NEXT: bne 0, .LBB3_31 |
| ; CHECK-NEXT: .LBB3_33: # %entry |
| ; CHECK-NEXT: xor 6, 30, 6 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 12, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 6, 6 |
| ; CHECK-NEXT: extsb 12, 12 |
| ; CHECK-NEXT: srwi 6, 6, 5 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_34: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 0, 0, 11 |
| ; CHECK-NEXT: cmpw 0, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_36 |
| ; CHECK-NEXT: # %bb.35: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 12, 0, 11 |
| ; CHECK-NEXT: bne 0, .LBB3_34 |
| ; CHECK-NEXT: .LBB3_36: # %entry |
| ; CHECK-NEXT: xor 6, 0, 6 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 11, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 6, 6 |
| ; CHECK-NEXT: extsb 11, 11 |
| ; CHECK-NEXT: srwi 6, 6, 5 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_37: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 12, 0, 10 |
| ; CHECK-NEXT: cmpw 12, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_39 |
| ; CHECK-NEXT: # %bb.38: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 11, 0, 10 |
| ; CHECK-NEXT: bne 0, .LBB3_37 |
| ; CHECK-NEXT: .LBB3_39: # %entry |
| ; CHECK-NEXT: xor 6, 12, 6 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 10, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 6, 6 |
| ; CHECK-NEXT: extsb 10, 10 |
| ; CHECK-NEXT: srwi 6, 6, 5 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_40: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 11, 0, 9 |
| ; CHECK-NEXT: cmpw 11, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_42 |
| ; CHECK-NEXT: # %bb.41: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 10, 0, 9 |
| ; CHECK-NEXT: bne 0, .LBB3_40 |
| ; CHECK-NEXT: .LBB3_42: # %entry |
| ; CHECK-NEXT: xor 6, 11, 6 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 9, sc@toc@l(4) |
| ; CHECK-NEXT: cntlzw 6, 6 |
| ; CHECK-NEXT: extsb 9, 9 |
| ; CHECK-NEXT: srwi 6, 6, 5 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: lbz 6, uc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_43: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 10, 0, 8 |
| ; CHECK-NEXT: cmpd 10, 6 |
| ; CHECK-NEXT: bne 0, .LBB3_45 |
| ; CHECK-NEXT: # %bb.44: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 9, 0, 8 |
| ; CHECK-NEXT: bne 0, .LBB3_43 |
| ; CHECK-NEXT: .LBB3_45: # %entry |
| ; CHECK-NEXT: xor 6, 10, 6 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: lbz 4, sc@toc@l(4) |
| ; CHECK-NEXT: lbz 3, uc@toc@l(3) |
| ; CHECK-NEXT: cntlzd 6, 6 |
| ; CHECK-NEXT: extsb 4, 4 |
| ; CHECK-NEXT: rldicl 6, 6, 58, 63 |
| ; CHECK-NEXT: stw 6, ui@toc@l(5) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: .LBB3_46: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 6, 0, 7 |
| ; CHECK-NEXT: cmpd 6, 3 |
| ; CHECK-NEXT: bne 0, .LBB3_48 |
| ; CHECK-NEXT: # %bb.47: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 7 |
| ; CHECK-NEXT: bne 0, .LBB3_46 |
| ; CHECK-NEXT: .LBB3_48: # %entry |
| ; CHECK-NEXT: xor 3, 6, 3 |
| ; 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: cntlzd 3, 3 |
| ; 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@toc@l(5) |
| ; CHECK-NEXT: blr |
| ; |
| ; AIX32-LABEL: test_compare_and_swap: |
| ; AIX32: # %bb.0: # %entry |
| ; AIX32-NEXT: mflr 0 |
| ; AIX32-NEXT: stwu 1, -128(1) |
| ; AIX32-NEXT: stw 0, 136(1) |
| ; AIX32-NEXT: stw 28, 112(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: lwz 28, L..C0(2) # @sc |
| ; AIX32-NEXT: stw 29, 116(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: lwz 29, L..C1(2) # @uc |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: rlwinm 5, 28, 3, 27, 28 |
| ; AIX32-NEXT: stw 21, 84(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; 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: stw 20, 80(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: xori 21, 5, 24 |
| ; AIX32-NEXT: stw 22, 88(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 23, 92(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 24, 96(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: slw 5, 3, 21 |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: slw 4, 4, 21 |
| ; AIX32-NEXT: stw 25, 100(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 26, 104(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: slw 3, 3, 21 |
| ; 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: sync |
| ; AIX32-NEXT: rlwinm 18, 28, 0, 0, 29 |
| ; AIX32-NEXT: and 4, 4, 3 |
| ; AIX32-NEXT: and 5, 5, 3 |
| ; AIX32-NEXT: L..BB3_1: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 7, 0, 18 |
| ; AIX32-NEXT: and 6, 7, 3 |
| ; AIX32-NEXT: cmpw 6, 5 |
| ; 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, 4 |
| ; AIX32-NEXT: stwcx. 7, 0, 18 |
| ; AIX32-NEXT: bne 0, L..BB3_1 |
| ; AIX32-NEXT: L..BB3_3: # %entry |
| ; AIX32-NEXT: rlwinm 5, 29, 3, 27, 28 |
| ; AIX32-NEXT: srw 3, 6, 21 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: rlwinm 20, 29, 0, 0, 29 |
| ; AIX32-NEXT: xori 25, 5, 24 |
| ; AIX32-NEXT: slw 5, 3, 25 |
| ; AIX32-NEXT: stb 3, 0(28) |
| ; AIX32-NEXT: li 3, 255 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 6, 4, 25 |
| ; AIX32-NEXT: slw 3, 3, 25 |
| ; AIX32-NEXT: and 4, 5, 3 |
| ; AIX32-NEXT: and 5, 6, 3 |
| ; AIX32-NEXT: L..BB3_4: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 7, 0, 20 |
| ; AIX32-NEXT: and 6, 7, 3 |
| ; AIX32-NEXT: cmpw 6, 5 |
| ; AIX32-NEXT: bne 0, L..BB3_6 |
| ; AIX32-NEXT: # %bb.5: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 7, 7, 3 |
| ; AIX32-NEXT: or 7, 7, 4 |
| ; AIX32-NEXT: stwcx. 7, 0, 20 |
| ; AIX32-NEXT: bne 0, L..BB3_4 |
| ; AIX32-NEXT: L..BB3_6: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: srw 4, 6, 25 |
| ; AIX32-NEXT: lbz 3, 0(28) |
| ; AIX32-NEXT: extsb 5, 3 |
| ; AIX32-NEXT: lwz 3, L..C2(2) # @ss |
| ; AIX32-NEXT: stb 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; AIX32-NEXT: rlwinm 22, 3, 0, 0, 29 |
| ; AIX32-NEXT: xori 26, 6, 16 |
| ; AIX32-NEXT: slw 6, 4, 26 |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: slw 5, 5, 26 |
| ; AIX32-NEXT: ori 4, 4, 65535 |
| ; AIX32-NEXT: slw 4, 4, 26 |
| ; AIX32-NEXT: and 5, 5, 4 |
| ; AIX32-NEXT: and 6, 6, 4 |
| ; AIX32-NEXT: L..BB3_7: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 22 |
| ; AIX32-NEXT: and 7, 8, 4 |
| ; AIX32-NEXT: cmpw 7, 6 |
| ; AIX32-NEXT: bne 0, L..BB3_9 |
| ; AIX32-NEXT: # %bb.8: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 8, 8, 4 |
| ; AIX32-NEXT: or 8, 8, 5 |
| ; AIX32-NEXT: stwcx. 8, 0, 22 |
| ; AIX32-NEXT: bne 0, L..BB3_7 |
| ; AIX32-NEXT: L..BB3_9: # %entry |
| ; AIX32-NEXT: srw 4, 7, 26 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: sth 4, 0(3) |
| ; AIX32-NEXT: lbz 3, 0(28) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: extsb 5, 3 |
| ; AIX32-NEXT: lwz 3, L..C3(2) # @us |
| ; AIX32-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; AIX32-NEXT: rlwinm 19, 3, 0, 0, 29 |
| ; AIX32-NEXT: xori 24, 6, 16 |
| ; AIX32-NEXT: slw 6, 4, 24 |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: ori 4, 4, 65535 |
| ; AIX32-NEXT: slw 4, 4, 24 |
| ; AIX32-NEXT: and 5, 5, 4 |
| ; AIX32-NEXT: and 6, 6, 4 |
| ; AIX32-NEXT: L..BB3_10: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 19 |
| ; AIX32-NEXT: and 7, 8, 4 |
| ; AIX32-NEXT: cmpw 7, 6 |
| ; AIX32-NEXT: bne 0, L..BB3_12 |
| ; AIX32-NEXT: # %bb.11: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 8, 8, 4 |
| ; AIX32-NEXT: or 8, 8, 5 |
| ; AIX32-NEXT: stwcx. 8, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB3_10 |
| ; AIX32-NEXT: L..BB3_12: # %entry |
| ; AIX32-NEXT: srw 4, 7, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 17, L..C4(2) # @si |
| ; AIX32-NEXT: sth 4, 0(3) |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: extsb 4, 4 |
| ; AIX32-NEXT: L..BB3_13: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 5, 0, 17 |
| ; AIX32-NEXT: cmpw 5, 3 |
| ; AIX32-NEXT: bne 0, L..BB3_15 |
| ; AIX32-NEXT: # %bb.14: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: stwcx. 4, 0, 17 |
| ; AIX32-NEXT: bne 0, L..BB3_13 |
| ; AIX32-NEXT: L..BB3_15: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stw 5, 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 4, 4 |
| ; AIX32-NEXT: L..BB3_16: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 5, 0, 27 |
| ; AIX32-NEXT: cmpw 5, 3 |
| ; AIX32-NEXT: bne 0, L..BB3_18 |
| ; AIX32-NEXT: # %bb.17: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: stwcx. 4, 0, 27 |
| ; AIX32-NEXT: bne 0, L..BB3_16 |
| ; AIX32-NEXT: L..BB3_18: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 31, L..C6(2) # @sll |
| ; AIX32-NEXT: stw 5, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(28) |
| ; AIX32-NEXT: li 23, 0 |
| ; AIX32-NEXT: addi 4, 1, 56 |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: stw 23, 56(1) |
| ; AIX32-NEXT: extsb 6, 3 |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: srawi 5, 6, 31 |
| ; AIX32-NEXT: stw 3, 60(1) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 3, 60(1) |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; AIX32-NEXT: lwz 30, L..C7(2) # @ull |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: stw 3, 4(31) |
| ; AIX32-NEXT: lwz 3, 56(1) |
| ; AIX32-NEXT: extsb 6, 4 |
| ; AIX32-NEXT: addi 4, 1, 56 |
| ; AIX32-NEXT: srawi 5, 6, 31 |
| ; AIX32-NEXT: stw 23, 56(1) |
| ; AIX32-NEXT: stw 3, 0(31) |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: stw 3, 60(1) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 4, 60(1) |
| ; AIX32-NEXT: lwz 3, 56(1) |
| ; AIX32-NEXT: stw 4, 4(30) |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; AIX32-NEXT: stw 3, 0(30) |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 5, 4, 21 |
| ; AIX32-NEXT: li 4, 255 |
| ; AIX32-NEXT: slw 6, 3, 21 |
| ; AIX32-NEXT: slw 4, 4, 21 |
| ; AIX32-NEXT: and 5, 5, 4 |
| ; AIX32-NEXT: and 6, 6, 4 |
| ; AIX32-NEXT: L..BB3_19: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 18 |
| ; AIX32-NEXT: and 7, 8, 4 |
| ; AIX32-NEXT: cmpw 7, 6 |
| ; AIX32-NEXT: bne 0, L..BB3_21 |
| ; AIX32-NEXT: # %bb.20: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 8, 8, 4 |
| ; AIX32-NEXT: or 8, 8, 5 |
| ; AIX32-NEXT: stwcx. 8, 0, 18 |
| ; AIX32-NEXT: bne 0, L..BB3_19 |
| ; AIX32-NEXT: L..BB3_21: # %entry |
| ; AIX32-NEXT: srw 4, 7, 21 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lbz 5, 0(28) |
| ; AIX32-NEXT: cmpw 4, 3 |
| ; AIX32-NEXT: li 3, 1 |
| ; AIX32-NEXT: iseleq 4, 3, 23 |
| ; AIX32-NEXT: slw 6, 5, 25 |
| ; AIX32-NEXT: li 5, 255 |
| ; AIX32-NEXT: stw 4, 0(27) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: slw 5, 5, 25 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 7, 4, 25 |
| ; AIX32-NEXT: and 6, 6, 5 |
| ; AIX32-NEXT: and 7, 7, 5 |
| ; AIX32-NEXT: L..BB3_22: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 9, 0, 20 |
| ; AIX32-NEXT: and 8, 9, 5 |
| ; AIX32-NEXT: cmpw 8, 7 |
| ; AIX32-NEXT: bne 0, L..BB3_24 |
| ; AIX32-NEXT: # %bb.23: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 9, 9, 5 |
| ; AIX32-NEXT: or 9, 9, 6 |
| ; AIX32-NEXT: stwcx. 9, 0, 20 |
| ; AIX32-NEXT: bne 0, L..BB3_22 |
| ; AIX32-NEXT: L..BB3_24: # %entry |
| ; AIX32-NEXT: srw 5, 8, 25 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: cmpw 5, 4 |
| ; AIX32-NEXT: lbz 5, 0(28) |
| ; AIX32-NEXT: iseleq 4, 3, 23 |
| ; AIX32-NEXT: extsb 5, 5 |
| ; AIX32-NEXT: stw 4, 0(27) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 6, 5, 26 |
| ; AIX32-NEXT: li 5, 0 |
| ; AIX32-NEXT: slw 7, 4, 26 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: slw 5, 5, 26 |
| ; AIX32-NEXT: and 6, 6, 5 |
| ; AIX32-NEXT: and 7, 7, 5 |
| ; AIX32-NEXT: L..BB3_25: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 9, 0, 22 |
| ; AIX32-NEXT: and 8, 9, 5 |
| ; AIX32-NEXT: cmpw 8, 7 |
| ; AIX32-NEXT: bne 0, L..BB3_27 |
| ; AIX32-NEXT: # %bb.26: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 9, 9, 5 |
| ; AIX32-NEXT: or 9, 9, 6 |
| ; AIX32-NEXT: stwcx. 9, 0, 22 |
| ; AIX32-NEXT: bne 0, L..BB3_25 |
| ; AIX32-NEXT: L..BB3_27: # %entry |
| ; AIX32-NEXT: srw 5, 8, 26 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: cmpw 5, 4 |
| ; AIX32-NEXT: lbz 5, 0(28) |
| ; AIX32-NEXT: iseleq 4, 3, 23 |
| ; AIX32-NEXT: extsb 5, 5 |
| ; AIX32-NEXT: stw 4, 0(27) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: slw 6, 5, 24 |
| ; AIX32-NEXT: li 5, 0 |
| ; AIX32-NEXT: slw 7, 4, 24 |
| ; AIX32-NEXT: ori 5, 5, 65535 |
| ; AIX32-NEXT: slw 5, 5, 24 |
| ; AIX32-NEXT: and 6, 6, 5 |
| ; AIX32-NEXT: and 7, 7, 5 |
| ; AIX32-NEXT: L..BB3_28: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 9, 0, 19 |
| ; AIX32-NEXT: and 8, 9, 5 |
| ; AIX32-NEXT: cmpw 8, 7 |
| ; AIX32-NEXT: bne 0, L..BB3_30 |
| ; AIX32-NEXT: # %bb.29: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: andc 9, 9, 5 |
| ; AIX32-NEXT: or 9, 9, 6 |
| ; AIX32-NEXT: stwcx. 9, 0, 19 |
| ; AIX32-NEXT: bne 0, L..BB3_28 |
| ; AIX32-NEXT: L..BB3_30: # %entry |
| ; AIX32-NEXT: srw 5, 8, 24 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: cmpw 5, 4 |
| ; AIX32-NEXT: lbz 5, 0(28) |
| ; AIX32-NEXT: iseleq 4, 3, 23 |
| ; AIX32-NEXT: stw 4, 0(27) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: extsb 5, 5 |
| ; AIX32-NEXT: L..BB3_31: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 17 |
| ; AIX32-NEXT: cmpw 1, 6, 4 |
| ; AIX32-NEXT: bne 1, L..BB3_33 |
| ; AIX32-NEXT: # %bb.32: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: stwcx. 5, 0, 17 |
| ; AIX32-NEXT: bne 0, L..BB3_31 |
| ; AIX32-NEXT: L..BB3_33: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: isel 4, 3, 23, 6 |
| ; AIX32-NEXT: lbz 5, 0(28) |
| ; AIX32-NEXT: stw 4, 0(27) |
| ; AIX32-NEXT: lbz 4, 0(29) |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: extsb 5, 5 |
| ; AIX32-NEXT: L..BB3_34: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 6, 0, 27 |
| ; AIX32-NEXT: cmpw 1, 6, 4 |
| ; AIX32-NEXT: bne 1, L..BB3_36 |
| ; AIX32-NEXT: # %bb.35: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: stwcx. 5, 0, 27 |
| ; AIX32-NEXT: bne 0, L..BB3_34 |
| ; AIX32-NEXT: L..BB3_36: # %entry |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: isel 3, 3, 23, 6 |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; AIX32-NEXT: stw 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: stw 23, 56(1) |
| ; AIX32-NEXT: extsb 6, 4 |
| ; AIX32-NEXT: addi 4, 1, 56 |
| ; AIX32-NEXT: stw 3, 60(1) |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: srawi 5, 6, 31 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lbz 4, 0(28) |
| ; AIX32-NEXT: stw 3, 0(27) |
| ; AIX32-NEXT: lbz 3, 0(29) |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: extsb 6, 4 |
| ; AIX32-NEXT: addi 4, 1, 56 |
| ; AIX32-NEXT: stw 3, 60(1) |
| ; AIX32-NEXT: mr 3, 30 |
| ; AIX32-NEXT: stw 23, 56(1) |
| ; AIX32-NEXT: srawi 5, 6, 31 |
| ; 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@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: li 7, 1 |
| ; CHECK-NEXT: addi 4, 3, sc@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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 5, sc@toc@l(3) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 6, 4, uc@toc@l |
| ; 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@toc@l(4) |
| ; CHECK-NEXT: addis 5, 2, ss@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 8, 5, ss@toc@l |
| ; 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@toc@l(5) |
| ; CHECK-NEXT: addis 6, 2, us@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 9, 6, us@toc@l |
| ; 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@toc@l(6) |
| ; CHECK-NEXT: addis 8, 2, si@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 10, 8, si@toc@l |
| ; 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@toc@l(8) |
| ; CHECK-NEXT: addis 9, 2, ui@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 11, 9, ui@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 10, ui@toc@l(9) |
| ; CHECK-NEXT: li 11, 1 |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 10, 7, sll@toc@l |
| ; 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@toc@ha |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: std 12, sll@toc@l(7) |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 0, 10, ull@toc@l |
| ; 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@toc@l(10) |
| ; CHECK-NEXT: li 11, 0 |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 11, sc@toc@l(3) |
| ; CHECK-NEXT: li 3, 0 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stb 11, uc@toc@l(4) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sth 11, ss@toc@l(5) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: sth 11, us@toc@l(6) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 11, si@toc@l(8) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: stw 11, ui@toc@l(9) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: std 3, sll@toc@l(7) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: std 3, ull@toc@l(10) |
| ; CHECK-NEXT: blr |
| ; |
| ; AIX32-LABEL: test_lock: |
| ; AIX32: # %bb.0: # %entry |
| ; AIX32-NEXT: mflr 0 |
| ; AIX32-NEXT: stwu 1, -96(1) |
| ; AIX32-NEXT: stw 0, 104(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 6, 255 |
| ; AIX32-NEXT: stw 23, 60(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 24, 64(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: rlwinm 4, 29, 3, 27, 28 |
| ; AIX32-NEXT: stw 25, 68(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 26, 72(1) # 4-byte Folded Spill |
| ; 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: stw 30, 88(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: stw 31, 92(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: slw 7, 3, 4 |
| ; AIX32-NEXT: slw 6, 6, 4 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: rlwinm 5, 29, 0, 0, 29 |
| ; AIX32-NEXT: and 7, 7, 6 |
| ; AIX32-NEXT: L..BB4_1: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 5 |
| ; AIX32-NEXT: andc 9, 8, 6 |
| ; AIX32-NEXT: or 9, 7, 9 |
| ; AIX32-NEXT: stwcx. 9, 0, 5 |
| ; AIX32-NEXT: bne 0, L..BB4_1 |
| ; AIX32-NEXT: # %bb.2: # %entry |
| ; AIX32-NEXT: srw 4, 8, 4 |
| ; AIX32-NEXT: lwz 28, L..C1(2) # @uc |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 6, 255 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: rlwinm 5, 28, 0, 0, 29 |
| ; AIX32-NEXT: stb 4, 0(29) |
| ; AIX32-NEXT: rlwinm 4, 28, 3, 27, 28 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: xori 4, 4, 24 |
| ; AIX32-NEXT: slw 7, 3, 4 |
| ; AIX32-NEXT: slw 6, 6, 4 |
| ; AIX32-NEXT: and 7, 7, 6 |
| ; AIX32-NEXT: L..BB4_3: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 5 |
| ; AIX32-NEXT: andc 9, 8, 6 |
| ; AIX32-NEXT: or 9, 7, 9 |
| ; AIX32-NEXT: stwcx. 9, 0, 5 |
| ; AIX32-NEXT: bne 0, L..BB4_3 |
| ; AIX32-NEXT: # %bb.4: # %entry |
| ; AIX32-NEXT: srw 4, 8, 4 |
| ; AIX32-NEXT: lwz 27, L..C2(2) # @ss |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 6, 0 |
| ; AIX32-NEXT: clrlwi 4, 4, 24 |
| ; AIX32-NEXT: ori 6, 6, 65535 |
| ; AIX32-NEXT: rlwinm 5, 27, 0, 0, 29 |
| ; AIX32-NEXT: stb 4, 0(28) |
| ; AIX32-NEXT: rlwinm 4, 27, 3, 27, 27 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: xori 4, 4, 16 |
| ; AIX32-NEXT: slw 7, 3, 4 |
| ; AIX32-NEXT: slw 6, 6, 4 |
| ; AIX32-NEXT: and 7, 7, 6 |
| ; AIX32-NEXT: L..BB4_5: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 5 |
| ; AIX32-NEXT: andc 9, 8, 6 |
| ; AIX32-NEXT: or 9, 7, 9 |
| ; AIX32-NEXT: stwcx. 9, 0, 5 |
| ; AIX32-NEXT: bne 0, L..BB4_5 |
| ; AIX32-NEXT: # %bb.6: # %entry |
| ; AIX32-NEXT: srw 4, 8, 4 |
| ; AIX32-NEXT: lwz 26, L..C3(2) # @us |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: li 6, 0 |
| ; AIX32-NEXT: clrlwi 4, 4, 16 |
| ; AIX32-NEXT: ori 6, 6, 65535 |
| ; AIX32-NEXT: rlwinm 5, 26, 0, 0, 29 |
| ; AIX32-NEXT: sth 4, 0(27) |
| ; AIX32-NEXT: rlwinm 4, 26, 3, 27, 27 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: xori 4, 4, 16 |
| ; AIX32-NEXT: slw 7, 3, 4 |
| ; AIX32-NEXT: slw 6, 6, 4 |
| ; AIX32-NEXT: and 7, 7, 6 |
| ; AIX32-NEXT: L..BB4_7: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 8, 0, 5 |
| ; AIX32-NEXT: andc 9, 8, 6 |
| ; AIX32-NEXT: or 9, 7, 9 |
| ; AIX32-NEXT: stwcx. 9, 0, 5 |
| ; AIX32-NEXT: bne 0, L..BB4_7 |
| ; AIX32-NEXT: # %bb.8: # %entry |
| ; AIX32-NEXT: srw 4, 8, 4 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: lwz 25, L..C4(2) # @si |
| ; 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: lwsync |
| ; AIX32-NEXT: stw 4, 0(25) |
| ; AIX32-NEXT: lwz 24, L..C5(2) # @ui |
| ; 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: mr 3, 31 |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: li 23, 0 |
| ; AIX32-NEXT: bl .__atomic_exchange_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 30, L..C7(2) # @ull |
| ; AIX32-NEXT: stw 4, 4(31) |
| ; AIX32-NEXT: li 4, 0 |
| ; AIX32-NEXT: li 5, 1 |
| ; AIX32-NEXT: li 6, 5 |
| ; AIX32-NEXT: stw 3, 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: li 4, 0 |
| ; AIX32-NEXT: li 5, 0 |
| ; AIX32-NEXT: mr 3, 31 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: stb 23, 0(29) |
| ; AIX32-NEXT: li 6, 3 |
| ; 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: li 4, 0 |
| ; AIX32-NEXT: li 5, 0 |
| ; AIX32-NEXT: mr 3, 30 |
| ; 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@toc@ha |
| ; CHECK-NEXT: li 3, 5 |
| ; CHECK-NEXT: addi 6, 4, ui@toc@l |
| ; CHECK-NEXT: .LBB5_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 5, 0, 6 |
| ; CHECK-NEXT: cmplwi 5, 5 |
| ; CHECK-NEXT: blt 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@toc@l(4) |
| ; CHECK-NEXT: addis 5, 2, si@toc@ha |
| ; CHECK-NEXT: sync |
| ; CHECK-NEXT: addi 7, 5, si@toc@l |
| ; CHECK-NEXT: .LBB5_4: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 7 |
| ; CHECK-NEXT: cmpwi 8, 5 |
| ; CHECK-NEXT: blt 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@toc@l(5) |
| ; CHECK-NEXT: .LBB5_7: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 6 |
| ; CHECK-NEXT: cmplwi 8, 5 |
| ; CHECK-NEXT: bgt 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@toc@l(4) |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: .LBB5_10: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 4, 0, 7 |
| ; CHECK-NEXT: cmpwi 4, 5 |
| ; CHECK-NEXT: bgt 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@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: cmplwi 5, 5 |
| ; AIX32-NEXT: blt 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: cmpwi 6, 5 |
| ; AIX32-NEXT: blt 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: cmplwi 6, 5 |
| ; AIX32-NEXT: bgt 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: cmpwi 4, 5 |
| ; AIX32-NEXT: bgt 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 4, 5, 1 |
| ; CHECK-NEXT: .LBB6_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 6, 0, 3 |
| ; CHECK-NEXT: cmpd 1, 6, 5 |
| ; CHECK-NEXT: bne 1, .LBB6_3 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB6_1 |
| ; CHECK-NEXT: .LBB6_3: # %entry |
| ; CHECK-NEXT: li 3, 66 |
| ; CHECK-NEXT: li 4, 55 |
| ; CHECK-NEXT: isel 3, 4, 3, 6 |
| ; CHECK-NEXT: blr |
| ; |
| ; AIX32-LABEL: cmpswplp: |
| ; AIX32: # %bb.0: # %entry |
| ; AIX32-NEXT: mflr 0 |
| ; AIX32-NEXT: stwu 1, -64(1) |
| ; AIX32-NEXT: addic 7, 6, 1 |
| ; AIX32-NEXT: stw 0, 72(1) |
| ; AIX32-NEXT: addze 8, 5 |
| ; AIX32-NEXT: stw 6, 60(1) |
| ; AIX32-NEXT: stw 5, 56(1) |
| ; AIX32-NEXT: addi 4, 1, 56 |
| ; AIX32-NEXT: mr 5, 8 |
| ; AIX32-NEXT: mr 6, 7 |
| ; 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 3, 66 |
| ; AIX32-NEXT: li 4, 55 |
| ; 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 1, 5, 4 |
| ; CHECK-NEXT: bgt 1, .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: li 3, 55 |
| ; CHECK-NEXT: li 4, 66 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: isel 3, 4, 3, 5 |
| ; CHECK-NEXT: blr |
| ; |
| ; AIX32-LABEL: atommax8: |
| ; AIX32: # %bb.0: # %entry |
| ; AIX32-NEXT: mflr 0 |
| ; AIX32-NEXT: stwu 1, -80(1) |
| ; AIX32-NEXT: stw 0, 88(1) |
| ; 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 30, 4 |
| ; AIX32-NEXT: lwz 4, 4(3) |
| ; AIX32-NEXT: lwz 5, 0(3) |
| ; AIX32-NEXT: stw 28, 64(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: addi 28, 1, 56 |
| ; AIX32-NEXT: stw 29, 68(1) # 4-byte Folded Spill |
| ; AIX32-NEXT: mr 29, 3 |
| ; AIX32-NEXT: .align 4 |
| ; AIX32-NEXT: L..BB7_1: # %atomicrmw.start |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: cmplw 5, 30 |
| ; AIX32-NEXT: cmpw 1, 5, 30 |
| ; AIX32-NEXT: li 7, 5 |
| ; AIX32-NEXT: li 8, 5 |
| ; AIX32-NEXT: stw 5, 56(1) |
| ; AIX32-NEXT: mr 3, 29 |
| ; AIX32-NEXT: crandc 20, 5, 2 |
| ; AIX32-NEXT: cmplw 1, 4, 31 |
| ; AIX32-NEXT: crand 21, 2, 5 |
| ; AIX32-NEXT: stw 4, 60(1) |
| ; AIX32-NEXT: cror 20, 21, 20 |
| ; AIX32-NEXT: isel 5, 5, 30, 20 |
| ; AIX32-NEXT: isel 6, 4, 31, 20 |
| ; AIX32-NEXT: mr 4, 28 |
| ; AIX32-NEXT: bl .__atomic_compare_exchange_8[PR] |
| ; AIX32-NEXT: nop |
| ; AIX32-NEXT: lwz 4, 60(1) |
| ; AIX32-NEXT: lwz 5, 56(1) |
| ; AIX32-NEXT: cmplwi 3, 0 |
| ; AIX32-NEXT: beq 0, L..BB7_1 |
| ; AIX32-NEXT: # %bb.2: # %atomicrmw.end |
| ; AIX32-NEXT: cmplw 5, 30 |
| ; AIX32-NEXT: cmpw 1, 5, 30 |
| ; AIX32-NEXT: li 3, 55 |
| ; AIX32-NEXT: lwz 30, 72(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: lwz 29, 68(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: lwz 28, 64(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: crandc 20, 5, 2 |
| ; AIX32-NEXT: cmplw 1, 4, 31 |
| ; AIX32-NEXT: li 4, 66 |
| ; AIX32-NEXT: lwz 31, 76(1) # 4-byte Folded Reload |
| ; AIX32-NEXT: crand 21, 2, 5 |
| ; 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 1, 5, 4 |
| ; CHECK-NEXT: bgt 1, .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: li 3, 55 |
| ; CHECK-NEXT: li 4, 66 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: isel 3, 4, 3, 5 |
| ; 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 1, 5, 4 |
| ; AIX32-NEXT: bgt 1, 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: li 3, 55 |
| ; AIX32-NEXT: li 4, 66 |
| ; AIX32-NEXT: lwsync |
| ; AIX32-NEXT: isel 3, 4, 3, 5 |
| ; 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 1, 5, 4 |
| ; CHECK-NEXT: bgt 1, .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: li 3, 55 |
| ; CHECK-NEXT: li 4, 66 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: isel 3, 4, 3, 5 |
| ; CHECK-NEXT: blr |
| ; |
| ; AIX32-LABEL: atommax2: |
| ; AIX32: # %bb.0: # %entry |
| ; AIX32-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; AIX32-NEXT: li 7, 0 |
| ; AIX32-NEXT: sync |
| ; AIX32-NEXT: extsh 5, 4 |
| ; AIX32-NEXT: rlwinm 3, 3, 0, 0, 29 |
| ; AIX32-NEXT: xori 6, 6, 16 |
| ; AIX32-NEXT: ori 7, 7, 65535 |
| ; AIX32-NEXT: slw 8, 5, 6 |
| ; AIX32-NEXT: slw 7, 7, 6 |
| ; AIX32-NEXT: and 8, 8, 7 |
| ; AIX32-NEXT: L..BB9_1: # %entry |
| ; AIX32-NEXT: # |
| ; AIX32-NEXT: lwarx 9, 0, 3 |
| ; AIX32-NEXT: and 10, 9, 7 |
| ; AIX32-NEXT: srw 10, 10, 6 |
| ; AIX32-NEXT: extsh 10, 10 |
| ; AIX32-NEXT: cmpw 10, 5 |
| ; AIX32-NEXT: bgt 0, L..BB9_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..BB9_1 |
| ; AIX32-NEXT: L..BB9_3: # %entry |
| ; AIX32-NEXT: srw 3, 9, 6 |
| ; 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 1, 5, 4 |
| ; CHECK-NEXT: bgt 1, .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: li 3, 55 |
| ; CHECK-NEXT: li 4, 66 |
| ; CHECK-NEXT: lwsync |
| ; CHECK-NEXT: isel 3, 4, 3, 5 |
| ; 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: rlwinm 3, 3, 0, 0, 29 |
| ; AIX32-NEXT: xori 5, 5, 24 |
| ; 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 10, 6 |
| ; AIX32-NEXT: bgt 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 |
| } |