| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc -verify-machineinstrs < %s | FileCheck %s |
| target datalayout = "E-m:e-i64:64-n32:64" |
| target triple = "powerpc64-unknown-linux-gnu" |
| |
| define void @a32min(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 { |
| ; CHECK-LABEL: a32min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB0_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 5, 0, 3 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB0_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i32 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a32max(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 { |
| ; CHECK-LABEL: a32max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB1_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 5, 0, 3 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB1_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i32 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a32umin(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 { |
| ; CHECK-LABEL: a32umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB2_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB2_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i32 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a32umax(ptr nocapture dereferenceable(4) %minimum, i32 %val) #0 { |
| ; CHECK-LABEL: a32umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB3_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stwcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB3_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i32 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a16min(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 { |
| ; CHECK-LABEL: a16min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: extsh 4, 4 |
| ; CHECK-NEXT: .LBB4_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 5, 0, 3 |
| ; CHECK-NEXT: extsh 5, 5 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB4_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a16max(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 { |
| ; CHECK-LABEL: a16max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: extsh 4, 4 |
| ; CHECK-NEXT: .LBB5_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 5, 0, 3 |
| ; CHECK-NEXT: extsh 5, 5 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB5_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a16umin(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 { |
| ; CHECK-LABEL: a16umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB6_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB6_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a16umax(ptr nocapture dereferenceable(4) %minimum, i16 %val) #1 { |
| ; CHECK-LABEL: a16umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB7_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lharx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: sthcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB7_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a8min(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 { |
| ; CHECK-LABEL: a8min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: extsb 4, 4 |
| ; CHECK-NEXT: .LBB8_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 5, 0, 3 |
| ; CHECK-NEXT: extsb 5, 5 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB8_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a8max(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 { |
| ; CHECK-LABEL: a8max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: extsb 4, 4 |
| ; CHECK-NEXT: .LBB9_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 5, 0, 3 |
| ; CHECK-NEXT: extsb 5, 5 |
| ; CHECK-NEXT: cmpw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB9_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a8umin(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 { |
| ; CHECK-LABEL: a8umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB10_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB10_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a8umax(ptr nocapture dereferenceable(4) %minimum, i8 %val) #1 { |
| ; CHECK-LABEL: a8umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB11_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lbarx 5, 0, 3 |
| ; CHECK-NEXT: cmplw 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stbcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB11_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a64min(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 { |
| ; CHECK-LABEL: a64min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB12_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 5, 0, 3 |
| ; CHECK-NEXT: cmpd 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB12_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i64 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a64max(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 { |
| ; CHECK-LABEL: a64max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB13_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 5, 0, 3 |
| ; CHECK-NEXT: cmpd 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB13_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i64 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a64umin(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 { |
| ; CHECK-LABEL: a64umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB14_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 5, 0, 3 |
| ; CHECK-NEXT: cmpld 5, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB14_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i64 %val monotonic |
| ret void |
| |
| } |
| |
| define void @a64umax(ptr nocapture dereferenceable(4) %minimum, i64 %val) #0 { |
| ; CHECK-LABEL: a64umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: .LBB15_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: ldarx 5, 0, 3 |
| ; CHECK-NEXT: cmpld 5, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: stdcx. 4, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB15_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i64 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae16min(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 { |
| ; CHECK-LABEL: ae16min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: li 5, 0 |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; CHECK-NEXT: extsh 4, 4 |
| ; CHECK-NEXT: ori 7, 5, 65535 |
| ; CHECK-NEXT: xori 5, 6, 16 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: slw 8, 4, 5 |
| ; CHECK-NEXT: slw 6, 7, 5 |
| ; CHECK-NEXT: and 7, 8, 6 |
| ; CHECK-NEXT: .LBB16_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 3 |
| ; CHECK-NEXT: and 9, 8, 6 |
| ; CHECK-NEXT: srw 9, 9, 5 |
| ; CHECK-NEXT: extsh 9, 9 |
| ; CHECK-NEXT: cmpw 9, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 8, 8, 6 |
| ; CHECK-NEXT: or 8, 7, 8 |
| ; CHECK-NEXT: stwcx. 8, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB16_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae16max(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 { |
| ; CHECK-LABEL: ae16max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: li 5, 0 |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; CHECK-NEXT: extsh 4, 4 |
| ; CHECK-NEXT: ori 7, 5, 65535 |
| ; CHECK-NEXT: xori 5, 6, 16 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: slw 8, 4, 5 |
| ; CHECK-NEXT: slw 6, 7, 5 |
| ; CHECK-NEXT: and 7, 8, 6 |
| ; CHECK-NEXT: .LBB17_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 3 |
| ; CHECK-NEXT: and 9, 8, 6 |
| ; CHECK-NEXT: srw 9, 9, 5 |
| ; CHECK-NEXT: extsh 9, 9 |
| ; CHECK-NEXT: cmpw 9, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 8, 8, 6 |
| ; CHECK-NEXT: or 8, 7, 8 |
| ; CHECK-NEXT: stwcx. 8, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB17_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae16umin(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 { |
| ; CHECK-LABEL: ae16umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: li 5, 0 |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; CHECK-NEXT: ori 5, 5, 65535 |
| ; CHECK-NEXT: xori 6, 6, 16 |
| ; CHECK-NEXT: slw 4, 4, 6 |
| ; CHECK-NEXT: slw 5, 5, 6 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: and 6, 4, 5 |
| ; CHECK-NEXT: .LBB18_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 7, 0, 3 |
| ; CHECK-NEXT: and 8, 7, 5 |
| ; CHECK-NEXT: cmplw 8, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 7, 7, 5 |
| ; CHECK-NEXT: or 7, 6, 7 |
| ; CHECK-NEXT: stwcx. 7, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB18_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae16umax(ptr nocapture dereferenceable(4) %minimum, i16 %val) #0 { |
| ; CHECK-LABEL: ae16umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: li 5, 0 |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 27 |
| ; CHECK-NEXT: ori 5, 5, 65535 |
| ; CHECK-NEXT: xori 6, 6, 16 |
| ; CHECK-NEXT: slw 4, 4, 6 |
| ; CHECK-NEXT: slw 5, 5, 6 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: and 6, 4, 5 |
| ; CHECK-NEXT: .LBB19_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 7, 0, 3 |
| ; CHECK-NEXT: and 8, 7, 5 |
| ; CHECK-NEXT: cmplw 8, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 7, 7, 5 |
| ; CHECK-NEXT: or 7, 6, 7 |
| ; CHECK-NEXT: stwcx. 7, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB19_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i16 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae8min(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 { |
| ; CHECK-LABEL: ae8min: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: rlwinm 5, 3, 3, 27, 28 |
| ; CHECK-NEXT: li 6, 255 |
| ; CHECK-NEXT: extsb 4, 4 |
| ; CHECK-NEXT: xori 5, 5, 24 |
| ; CHECK-NEXT: slw 7, 4, 5 |
| ; CHECK-NEXT: slw 6, 6, 5 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: and 7, 7, 6 |
| ; CHECK-NEXT: .LBB20_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 3 |
| ; CHECK-NEXT: and 9, 8, 6 |
| ; CHECK-NEXT: srw 9, 9, 5 |
| ; CHECK-NEXT: extsb 9, 9 |
| ; CHECK-NEXT: cmpw 9, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 8, 8, 6 |
| ; CHECK-NEXT: or 8, 7, 8 |
| ; CHECK-NEXT: stwcx. 8, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB20_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw min ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae8max(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 { |
| ; CHECK-LABEL: ae8max: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: rlwinm 5, 3, 3, 27, 28 |
| ; CHECK-NEXT: li 6, 255 |
| ; CHECK-NEXT: extsb 4, 4 |
| ; CHECK-NEXT: xori 5, 5, 24 |
| ; CHECK-NEXT: slw 7, 4, 5 |
| ; CHECK-NEXT: slw 6, 6, 5 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: and 7, 7, 6 |
| ; CHECK-NEXT: .LBB21_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 8, 0, 3 |
| ; CHECK-NEXT: and 9, 8, 6 |
| ; CHECK-NEXT: srw 9, 9, 5 |
| ; CHECK-NEXT: extsb 9, 9 |
| ; CHECK-NEXT: cmpw 9, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 8, 8, 6 |
| ; CHECK-NEXT: or 8, 7, 8 |
| ; CHECK-NEXT: stwcx. 8, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB21_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw max ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae8umin(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 { |
| ; CHECK-LABEL: ae8umin: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 28 |
| ; CHECK-NEXT: li 5, 255 |
| ; CHECK-NEXT: xori 6, 6, 24 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: slw 4, 4, 6 |
| ; CHECK-NEXT: slw 5, 5, 6 |
| ; CHECK-NEXT: and 6, 4, 5 |
| ; CHECK-NEXT: .LBB22_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 7, 0, 3 |
| ; CHECK-NEXT: and 8, 7, 5 |
| ; CHECK-NEXT: cmplw 8, 4 |
| ; CHECK-NEXT: bltlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 7, 7, 5 |
| ; CHECK-NEXT: or 7, 6, 7 |
| ; CHECK-NEXT: stwcx. 7, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB22_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umin ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| define void @ae8umax(ptr nocapture dereferenceable(4) %minimum, i8 %val) #0 { |
| ; CHECK-LABEL: ae8umax: |
| ; CHECK: # %bb.0: # %entry |
| ; CHECK-NEXT: rlwinm 6, 3, 3, 27, 28 |
| ; CHECK-NEXT: li 5, 255 |
| ; CHECK-NEXT: xori 6, 6, 24 |
| ; CHECK-NEXT: rldicr 3, 3, 0, 61 |
| ; CHECK-NEXT: slw 4, 4, 6 |
| ; CHECK-NEXT: slw 5, 5, 6 |
| ; CHECK-NEXT: and 6, 4, 5 |
| ; CHECK-NEXT: .LBB23_1: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: lwarx 7, 0, 3 |
| ; CHECK-NEXT: and 8, 7, 5 |
| ; CHECK-NEXT: cmplw 8, 4 |
| ; CHECK-NEXT: bgtlr 0 |
| ; CHECK-NEXT: # %bb.2: # %entry |
| ; CHECK-NEXT: # |
| ; CHECK-NEXT: andc 7, 7, 5 |
| ; CHECK-NEXT: or 7, 6, 7 |
| ; CHECK-NEXT: stwcx. 7, 0, 3 |
| ; CHECK-NEXT: bne 0, .LBB23_1 |
| ; CHECK-NEXT: # %bb.3: # %entry |
| ; CHECK-NEXT: blr |
| entry: |
| %0 = atomicrmw umax ptr %minimum, i8 %val monotonic |
| ret void |
| |
| } |
| |
| attributes #0 = { nounwind "target-cpu"="ppc64" } |
| attributes #1 = { nounwind "target-cpu"="pwr8" } |
| |