240 lines
8.3 KiB
LLVM
240 lines
8.3 KiB
LLVM
; 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
|
|
}
|