; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc -mtriple=ve-unknown-unknown < %s | FileCheck %s define i8 @atomicrmw_uinc_wrap_i8(ptr %ptr, i8 %val) { ; CHECK-LABEL: atomicrmw_uinc_wrap_i8: ; CHECK: # %bb.0: ; CHECK-NEXT: and %s3, %s1, (32)0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: and %s1, -4, %s0 ; CHECK-NEXT: and %s0, 3, %s0 ; CHECK-NEXT: sla.w.sx %s0, %s0, 3 ; CHECK-NEXT: sla.w.sx %s2, (56)0, %s0 ; CHECK-NEXT: ldl.sx %s4, (, %s1) ; CHECK-NEXT: xor %s2, -1, %s2 ; CHECK-NEXT: and %s2, %s2, (32)0 ; CHECK-NEXT: and %s3, %s3, (56)0 ; CHECK-NEXT: .LBB0_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s5, 0, %s4 ; CHECK-NEXT: and %s4, %s5, (32)0 ; CHECK-NEXT: srl %s4, %s4, %s0 ; CHECK-NEXT: and %s6, %s4, (56)0 ; CHECK-NEXT: adds.w.sx %s4, 1, %s4 ; CHECK-NEXT: cmpu.w %s6, %s6, %s3 ; CHECK-NEXT: cmov.w.ge %s4, (0)1, %s6 ; CHECK-NEXT: and %s4, %s4, (56)0 ; CHECK-NEXT: sla.w.sx %s4, %s4, %s0 ; CHECK-NEXT: and %s6, %s5, %s2 ; CHECK-NEXT: or %s4, %s6, %s4 ; CHECK-NEXT: cas.w %s4, (%s1), %s5 ; CHECK-NEXT: brne.w %s4, %s5, .LBB0_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: and %s1, %s4, (32)0 ; CHECK-NEXT: srl %s0, %s1, %s0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw uinc_wrap ptr %ptr, i8 %val seq_cst ret i8 %result } define i16 @atomicrmw_uinc_wrap_i16(ptr %ptr, i16 %val) { ; CHECK-LABEL: atomicrmw_uinc_wrap_i16: ; CHECK: # %bb.0: ; CHECK-NEXT: and %s3, %s1, (32)0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: and %s1, -4, %s0 ; CHECK-NEXT: and %s0, 3, %s0 ; CHECK-NEXT: sla.w.sx %s0, %s0, 3 ; CHECK-NEXT: sla.w.sx %s2, (48)0, %s0 ; CHECK-NEXT: ldl.sx %s4, (, %s1) ; CHECK-NEXT: xor %s2, -1, %s2 ; CHECK-NEXT: and %s2, %s2, (32)0 ; CHECK-NEXT: and %s3, %s3, (48)0 ; CHECK-NEXT: .LBB1_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s5, 0, %s4 ; CHECK-NEXT: and %s4, %s5, (32)0 ; CHECK-NEXT: srl %s4, %s4, %s0 ; CHECK-NEXT: and %s6, %s4, (48)0 ; CHECK-NEXT: adds.w.sx %s4, 1, %s4 ; CHECK-NEXT: cmpu.w %s6, %s6, %s3 ; CHECK-NEXT: cmov.w.ge %s4, (0)1, %s6 ; CHECK-NEXT: and %s4, %s4, (48)0 ; CHECK-NEXT: sla.w.sx %s4, %s4, %s0 ; CHECK-NEXT: and %s6, %s5, %s2 ; CHECK-NEXT: or %s4, %s6, %s4 ; CHECK-NEXT: cas.w %s4, (%s1), %s5 ; CHECK-NEXT: brne.w %s4, %s5, .LBB1_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: and %s1, %s4, (32)0 ; CHECK-NEXT: srl %s0, %s1, %s0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw uinc_wrap ptr %ptr, i16 %val seq_cst ret i16 %result } define i32 @atomicrmw_uinc_wrap_i32(ptr %ptr, i32 %val) { ; CHECK-LABEL: atomicrmw_uinc_wrap_i32: ; CHECK: # %bb.0: ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: ldl.sx %s2, (, %s0) ; CHECK-NEXT: and %s1, %s1, (32)0 ; CHECK-NEXT: .LBB2_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: adds.w.sx %s2, 1, %s2 ; CHECK-NEXT: cmpu.w %s4, %s3, %s1 ; CHECK-NEXT: cmov.w.ge %s2, (0)1, %s4 ; CHECK-NEXT: cas.w %s2, (%s0), %s3 ; CHECK-NEXT: brne.w %s2, %s3, .LBB2_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: or %s0, 0, %s2 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw uinc_wrap ptr %ptr, i32 %val seq_cst ret i32 %result } define i64 @atomicrmw_uinc_wrap_i64(ptr %ptr, i64 %val) { ; CHECK-LABEL: atomicrmw_uinc_wrap_i64: ; CHECK: # %bb.0: ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: ld %s2, (, %s0) ; CHECK-NEXT: .LBB3_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: lea %s2, 1(, %s2) ; CHECK-NEXT: cmpu.l %s4, %s3, %s1 ; CHECK-NEXT: cmov.l.ge %s2, (0)1, %s4 ; CHECK-NEXT: cas.l %s2, (%s0), %s3 ; CHECK-NEXT: brne.l %s2, %s3, .LBB3_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: or %s0, 0, %s2 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw uinc_wrap ptr %ptr, i64 %val seq_cst ret i64 %result } define i8 @atomicrmw_udec_wrap_i8(ptr %ptr, i8 %val) { ; CHECK-LABEL: atomicrmw_udec_wrap_i8: ; CHECK: # %bb.0: ; CHECK-NEXT: and %s1, %s1, (32)0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: and %s2, -4, %s0 ; CHECK-NEXT: and %s0, 3, %s0 ; CHECK-NEXT: sla.w.sx %s0, %s0, 3 ; CHECK-NEXT: sla.w.sx %s3, (56)0, %s0 ; CHECK-NEXT: ldl.sx %s5, (, %s2) ; CHECK-NEXT: xor %s3, -1, %s3 ; CHECK-NEXT: and %s3, %s3, (32)0 ; CHECK-NEXT: and %s4, %s1, (56)0 ; CHECK-NEXT: .LBB4_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s6, 0, %s5 ; CHECK-NEXT: and %s5, %s6, (32)0 ; CHECK-NEXT: srl %s5, %s5, %s0 ; CHECK-NEXT: and %s7, %s5, (56)0 ; CHECK-NEXT: adds.w.sx %s5, -1, %s5 ; CHECK-NEXT: cmpu.w %s34, %s7, %s4 ; CHECK-NEXT: cmov.w.gt %s5, %s1, %s34 ; CHECK-NEXT: cmov.w.eq %s5, %s1, %s7 ; CHECK-NEXT: and %s5, %s5, (56)0 ; CHECK-NEXT: sla.w.sx %s5, %s5, %s0 ; CHECK-NEXT: and %s7, %s6, %s3 ; CHECK-NEXT: or %s5, %s7, %s5 ; CHECK-NEXT: cas.w %s5, (%s2), %s6 ; CHECK-NEXT: brne.w %s5, %s6, .LBB4_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: and %s1, %s5, (32)0 ; CHECK-NEXT: srl %s0, %s1, %s0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw udec_wrap ptr %ptr, i8 %val seq_cst ret i8 %result } define i16 @atomicrmw_udec_wrap_i16(ptr %ptr, i16 %val) { ; CHECK-LABEL: atomicrmw_udec_wrap_i16: ; CHECK: # %bb.0: ; CHECK-NEXT: and %s1, %s1, (32)0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: and %s2, -4, %s0 ; CHECK-NEXT: and %s0, 3, %s0 ; CHECK-NEXT: sla.w.sx %s0, %s0, 3 ; CHECK-NEXT: sla.w.sx %s3, (48)0, %s0 ; CHECK-NEXT: ldl.sx %s5, (, %s2) ; CHECK-NEXT: xor %s3, -1, %s3 ; CHECK-NEXT: and %s3, %s3, (32)0 ; CHECK-NEXT: and %s4, %s1, (48)0 ; CHECK-NEXT: .LBB5_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s6, 0, %s5 ; CHECK-NEXT: and %s5, %s6, (32)0 ; CHECK-NEXT: srl %s5, %s5, %s0 ; CHECK-NEXT: and %s7, %s5, (48)0 ; CHECK-NEXT: adds.w.sx %s5, -1, %s5 ; CHECK-NEXT: cmpu.w %s34, %s7, %s4 ; CHECK-NEXT: cmov.w.gt %s5, %s1, %s34 ; CHECK-NEXT: cmov.w.eq %s5, %s1, %s7 ; CHECK-NEXT: and %s5, %s5, (48)0 ; CHECK-NEXT: sla.w.sx %s5, %s5, %s0 ; CHECK-NEXT: and %s7, %s6, %s3 ; CHECK-NEXT: or %s5, %s7, %s5 ; CHECK-NEXT: cas.w %s5, (%s2), %s6 ; CHECK-NEXT: brne.w %s5, %s6, .LBB5_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: and %s1, %s5, (32)0 ; CHECK-NEXT: srl %s0, %s1, %s0 ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw udec_wrap ptr %ptr, i16 %val seq_cst ret i16 %result } define i32 @atomicrmw_udec_wrap_i32(ptr %ptr, i32 %val) { ; CHECK-LABEL: atomicrmw_udec_wrap_i32: ; CHECK: # %bb.0: ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: ldl.sx %s2, (, %s0) ; CHECK-NEXT: and %s1, %s1, (32)0 ; CHECK-NEXT: .LBB6_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: adds.w.sx %s2, -1, %s2 ; CHECK-NEXT: cmpu.w %s4, %s3, %s1 ; CHECK-NEXT: cmov.w.gt %s2, %s1, %s4 ; CHECK-NEXT: cmov.w.eq %s2, %s1, %s3 ; CHECK-NEXT: cas.w %s2, (%s0), %s3 ; CHECK-NEXT: brne.w %s2, %s3, .LBB6_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: or %s0, 0, %s2 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw udec_wrap ptr %ptr, i32 %val seq_cst ret i32 %result } define i64 @atomicrmw_udec_wrap_i64(ptr %ptr, i64 %val) { ; CHECK-LABEL: atomicrmw_udec_wrap_i64: ; CHECK: # %bb.0: ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: ld %s2, (, %s0) ; CHECK-NEXT: .LBB7_1: # %atomicrmw.start ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1 ; CHECK-NEXT: or %s3, 0, %s2 ; CHECK-NEXT: lea %s2, -1(, %s2) ; CHECK-NEXT: cmpu.l %s4, %s3, %s1 ; CHECK-NEXT: cmov.l.gt %s2, %s1, %s4 ; CHECK-NEXT: cmov.l.eq %s2, %s1, %s3 ; CHECK-NEXT: cas.l %s2, (%s0), %s3 ; CHECK-NEXT: brne.l %s2, %s3, .LBB7_1 ; CHECK-NEXT: # %bb.2: # %atomicrmw.end ; CHECK-NEXT: fencem 3 ; CHECK-NEXT: or %s0, 0, %s2 ; CHECK-NEXT: b.l.t (, %s10) %result = atomicrmw udec_wrap ptr %ptr, i64 %val seq_cst ret i64 %result }