xref: /llvm-project/llvm/test/CodeGen/SystemZ/atomicrmw-and-04.ll (revision 435ba72afda756183a1ddc7a3a160152ad630951)
1; Test 64-bit atomic ANDs.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s
4
5; Check ANDs of a variable.
6define i64 @f1(i64 %dummy, ptr %src, i64 %b) {
7; CHECK-LABEL: f1:
8; CHECK: lg %r2, 0(%r3)
9; CHECK: [[LABEL:\.[^:]*]]:
10; CHECK: lgr %r0, %r2
11; CHECK: ngr %r0, %r4
12; CHECK: csg %r2, %r0, 0(%r3)
13; CHECK: jl [[LABEL]]
14; CHECK: br %r14
15  %res = atomicrmw and ptr %src, i64 %b seq_cst
16  ret i64 %res
17}
18
19; Check ANDs of 1, which are done using a register.
20define i64 @f2(i64 %dummy, ptr %src) {
21; CHECK-LABEL: f2:
22; CHECK: risbg
23; CHECK: br %r14
24  %res = atomicrmw and ptr %src, i64 1 seq_cst
25  ret i64 %res
26}
27
28; Check the equivalent of NIHF with 1, which can use RISBG instead.
29define i64 @f3(i64 %dummy, ptr %src) {
30; CHECK-LABEL: f3:
31; CHECK: lg %r2, 0(%r3)
32; CHECK: [[LABEL:\.[^:]*]]:
33; CHECK: risbg %r0, %r2, 31, 191, 0
34; CHECK: csg %r2, %r0, 0(%r3)
35; CHECK: jl [[LABEL]]
36; CHECK: br %r14
37  %res = atomicrmw and ptr %src, i64 8589934591 seq_cst
38  ret i64 %res
39}
40
41; Check the lowest NIHF value outside the range of RISBG.
42define i64 @f4(i64 %dummy, ptr %src) {
43; CHECK-LABEL: f4:
44; CHECK: lg %r2, 0(%r3)
45; CHECK: [[LABEL:\.[^:]*]]:
46; CHECK: lgr %r0, %r2
47; CHECK: nihf %r0, 2
48; CHECK: csg %r2, %r0, 0(%r3)
49; CHECK: jl [[LABEL]]
50; CHECK: br %r14
51  %res = atomicrmw and ptr %src, i64 12884901887 seq_cst
52  ret i64 %res
53}
54
55; Check the next value up, which must use a register.
56define i64 @f5(i64 %dummy, ptr %src) {
57; CHECK-LABEL: f5:
58; CHECK: risbg
59; CHECK: br %r14
60  %res = atomicrmw and ptr %src, i64 12884901888 seq_cst
61  ret i64 %res
62}
63
64; Check the lowest NIHH value outside the range of RISBG.
65define i64 @f6(i64 %dummy, ptr %src) {
66; CHECK-LABEL: f6:
67; CHECK: nihh {{%r[0-5]}}, 2
68; CHECK: br %r14
69  %res = atomicrmw and ptr %src, i64 844424930131967 seq_cst
70  ret i64 %res
71}
72
73; Check the next value up, which must use a register.
74define i64 @f7(i64 %dummy, ptr %src) {
75; CHECK-LABEL: f7:
76; CHECK: risbg
77; CHECK: br %r14
78  %res = atomicrmw and ptr %src, i64 281474976710656 seq_cst
79  ret i64 %res
80}
81
82; Check the highest NILL value outside the range of RISBG.
83define i64 @f8(i64 %dummy, ptr %src) {
84; CHECK-LABEL: f8:
85; CHECK: nill {{%r[0-5]}}, 65530
86; CHECK: br %r14
87  %res = atomicrmw and ptr %src, i64 -6 seq_cst
88  ret i64 %res
89}
90
91; Check the lowest NILL value outside the range of RISBG.
92define i64 @f9(i64 %dummy, ptr %src) {
93; CHECK-LABEL: f9:
94; CHECK: nill {{%r[0-5]}}, 2
95; CHECK: br %r14
96  %res = atomicrmw and ptr %src, i64 -65534 seq_cst
97  ret i64 %res
98}
99
100; Check the highest useful NILF value.
101define i64 @f10(i64 %dummy, ptr %src) {
102; CHECK-LABEL: f10:
103; CHECK: nilf {{%r[0-5]}}, 4294901758
104; CHECK: br %r14
105  %res = atomicrmw and ptr %src, i64 -65538 seq_cst
106  ret i64 %res
107}
108
109; Check the highest NILH value outside the range of RISBG.
110define i64 @f11(i64 %dummy, ptr %src) {
111; CHECK-LABEL: f11:
112; CHECK: nilh {{%r[0-5]}}, 65530
113; CHECK: br %r14
114  %res = atomicrmw and ptr %src, i64 -327681 seq_cst
115  ret i64 %res
116}
117
118; Check the lowest NILH value outside the range of RISBG.
119define i64 @f12(i64 %dummy, ptr %src) {
120; CHECK-LABEL: f12:
121; CHECK: nilh {{%r[0-5]}}, 2
122; CHECK: br %r14
123  %res = atomicrmw and ptr %src, i64 -4294770689 seq_cst
124  ret i64 %res
125}
126
127; Check the lowest NILF value outside the range of RISBG.
128define i64 @f13(i64 %dummy, ptr %src) {
129; CHECK-LABEL: f13:
130; CHECK: nilf {{%r[0-5]}}, 2
131; CHECK: br %r14
132  %res = atomicrmw and ptr %src, i64 -4294967294 seq_cst
133  ret i64 %res
134}
135
136; Check the highest NIHL value outside the range of RISBG.
137define i64 @f14(i64 %dummy, ptr %src) {
138; CHECK-LABEL: f14:
139; CHECK: nihl {{%r[0-5]}}, 65530
140; CHECK: br %r14
141  %res = atomicrmw and ptr %src, i64 -21474836481 seq_cst
142  ret i64 %res
143}
144
145; Check the lowest NIHL value outside the range of RISBG.
146define i64 @f15(i64 %dummy, ptr %src) {
147; CHECK-LABEL: f15:
148; CHECK: nihl {{%r[0-5]}}, 2
149; CHECK: br %r14
150  %res = atomicrmw and ptr %src, i64 -281462091808769 seq_cst
151  ret i64 %res
152}
153
154; Check the highest NIHH value outside the range of RISBG.
155define i64 @f16(i64 %dummy, ptr %src) {
156; CHECK-LABEL: f16:
157; CHECK: nihh {{%r[0-5]}}, 65530
158; CHECK: br %r14
159  %res = atomicrmw and ptr %src, i64 -1407374883553281 seq_cst
160  ret i64 %res
161}
162
163; Check the highest useful NIHF value.
164define i64 @f17(i64 %dummy, ptr %src) {
165; CHECK-LABEL: f17:
166; CHECK: nihf {{%r[0-5]}}, 4294901758
167; CHECK: br %r14
168  %res = atomicrmw and ptr %src, i64 -281479271677953 seq_cst
169  ret i64 %res
170}
171