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